Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Autor | Správa |
---|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
Potreboval by som poradit.
Kód: ... Data = 0; i = 0; while( i < NumberOfGate ){
Read(); Data = CntData + Data; i++; if( Terminated ) break; } DataArray[z] = Data ; ...
Kód: void GetCntThread::Read () { BYTE ResultReturned; if(FALSE == C8855ReadData( hC8855, &CntData, &ResultReturned)){; Form1->Memo2->Lines->Add("Read data ERROR."); return; } }
Moja funkcia C8855ReadData() nacitava udaje z externeho zariadenia. To da nastavy v inej casti kodu, aby vysielalo data kazdy presne stanoveny casovy interval. Avsak nedokonalostou sa stava , ze mi externe zariadenie neodosle informaciu. Vdedy program zamrzne, lebo stale caka na data , ktore ale nikdy nepridu.
Potreboval by som nejakym sposobom osetrit Read() . Viem ze extistuju timeouty , ktore by mohli pomoct ale neviem ich v C++ pouzit (teda nasiel som o tom vela ale v c++ skoro nic ) . Sami si ich neviem spravit , nie som taky guru programator
Dakujem uz teraz.
|
|
Registrovaný: 11.01.09 Prihlásený: 06.01.25 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Neviem, ako pracuje funkcia C8855ReadData, ale ak nebeží paralelne, tj. čaká sa na jej ukončenie, tak by som celú funkciu Read() spúšťal v novom vlákne. V prípade spomínanej nedokonalosti aplikácia nezatuhne, ale iba dané vlákno (a to by sa dalo v krajnom prípade násilne ukončiť).
|
|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
Paralerne nebezi, lebo s vlaknami robyt neviem. Funkcia v podstate len caka na data ktore pridu a potom pokracuje. Ta chyba sa netika softu ale samotneho hardweru a neda sa odstranit. Proste raz za cas tie data neposle.
Viem ze v .NET aplikaciach abo Jave existuju timeouty ktore pre funkciu vyhradia maximalny cas, ak sa do vtedy funkcia sama neukonci. V C++ by mao extistovat tiez nico podobne ale nieviem ako to spravit.
|
|
Registrovaný: 11.01.09 Prihlásený: 06.01.25 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ak ti bránia použiť vlákna iba vedomosti, tak ti trocha pomôžem. Ak pracuješ vo Windowse, budeš potrebovať tieto WinAPI funkcie:
CreateThread
http://miniurl.com/51828
ResumeThread
http://miniurl.com/51829
TerminateThread
http://miniurl.com/51830
WaitForSingleObject
http://miniurl.com/51831
Samotný kód:
Kód: //... Data = 0; i = 0; int interval_ms = 5000; // cas, ktory potrebujes, v ms DWORD threadID; HANDLE hThread;
while( i < NumberOfGate ) {
hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) &ThreadFunction, NULL, 0, &threadID ); if ( WaitForSingleObject( hThread, interval_ms ) == WAIT_TIMEOUT ) TerminateThread( hThread, 0 ); // nasilne ukoncenie v pripade, ako to funkcia nestihne vcas
Data = CntData + Data; i++; if( Terminated ) break;
}
DataArray[z] = Data ; //... Funkcia vlákna: Kód: DWORD WINAPI ThreadFunction( LPVOID ) {
BYTE ResultReturned; if ( FALSE == C8855ReadData( hC8855, &CntData, &ResultReturned)) { Form1->Memo2->Lines->Add("Read data ERROR."); return; } }
Ak niečo nie je jasné, prípadne to nefunguje, ozvi sa.
|
|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
Vyzera to pekne.
Vyhodilo mi jednu chybu:
[BCC32 Error] Unit2.cpp(70): E2451 Undefined symbol 'ThreadFunction'
pri:
Kód: hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) [b]&ThreadFunction[/b], NULL, 0, &threadID );
|
|
Registrovaný: 11.01.09 Prihlásený: 06.01.25 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Zrejme si v hlavičkovom súbore zabudol pripísať jej prototyp:
Kód: DWORD WINAPI ThreadFunction( LPVOID );
// môžeš to pridať aj v aktuálnom zdrojovom súbore medzi include-ami a začiatkom definície funkcií, ale je zvykom písať prototypy do hlavičkového súboru
_________________ Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS. |
|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
praveze hlavicka je napisana dobre ...
|
|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
kniznica je <windows.h> ?
Pripadne netreba nieco deklarovat aj v *.h subore ?
|
|
Registrovaný: 27.08.10 Prihlásený: 27.08.10 Príspevky: 8 Témy: 1 | 1 |
AA .. pardon
nasiel som chybu...
Zajtra to skusim otestovat .... dufam ze to uz pojde bez problemou.
Dam vediet ako to dopadlo. Velka vdaka
|
|
Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Operačné systémy Unix a Linux | 0 | 460 | 25.01.2010 20:30 JanoF | | v JavaScript, VBScript, Ajax | 11 | 1338 | 18.11.2007 14:48 delo101 | | v PHP, ASP | 0 | 661 | 08.11.2011 16:19 quark | | v Ovládače | 6 | 614 | 25.09.2017 17:58 2petter8 | | v Ostatné programy | 4 | 491 | 02.12.2011 16:38 stevo512 | | v JavaScript, VBScript, Ajax | 2 | 512 | 25.04.2012 17:34 KViki | | v ATI/AMD grafické karty | 2 | 223 | 10.01.2024 20:09 misterso | | v Assembler, C, C++, Pascal, Java | 5 | 796 | 08.07.2014 20:40 XOLOO | | v Počítačové hry | 10 | 1298 | 07.03.2007 19:22 Spirit | | v Kúpim | 0 | 463 | 13.05.2014 18:16 expresado | | v Ponuka práce | 0 | 1414 | 10.05.2016 14:59 evolvsys | | v Assembler, C, C++, Pascal, Java | 4 | 621 | 20.07.2010 12:54 walther | | v Assembler, C, C++, Pascal, Java | 18 | 2478 | 21.05.2010 21:08 Wpegb | | v Assembler, C, C++, Pascal, Java | 8 | 2013 | 19.02.2011 22:46 vendo2 | | v Assembler, C, C++, Pascal, Java | 17 | 1198 | 25.09.2011 18:14 reDo | | v Ponuka práce | 1 | 610 | 24.10.2016 15:28 michalesku |
|