[ headstrong @ 23.10.2002. 00:01 ] @
Da li je moguće rešiti sledeći problem.
Radim "multithread" aplikaciju za Win32 platforme. Zbog brzine sam se odlučio da koristim API.
E sad, kada detektujem kritičnu grešku u jednom od tredova, treba da nekako naložim zatvarnje i ostalih tredova, ne želeći da koristim diskutabilnu f-ju TerminateThreads(), jer svaki od tredova treba da obavi "cleanup" alocirane memorije, a biće mi eventualno potrebno da se zatvaranje tredova detektuje i u linkovanom dll-u.
Da li postoji neko elegantno rešenje sa npr. izazivanjem nečega poput interapta u ostalim tredovima, pa da se oni regularno pozatvaraju nakon toga?
[ silverglider @ 23.10.2002. 01:22 ] @
Pa kreiraj svoj event (ne event kao obrada windows WM_ message poruka kroz event-handler), nego kao Event objekat. Posto se i on kreira kroz windows API, vide ga svi threadovi (tj, event objekti se i koriste za 'razgovor' medju threadovima). Dakle, stanje signaliziras sa setevent, a u threadu u execute funkciji, hvatas taj signal sa waitfor.
[ Mikky @ 23.10.2002. 10:46 ] @
mozda lupam a mozda i nije najbolje resenje ali ako imas petlju poruka u threadovima onda mozes da saljes npr WM_QUIT preko PostThreadMessage();
[ Milan Aksic @ 23.10.2002. 14:23 ] @
Ne moraju svi threadovi (ali uglavnom je to u zavisnosti od slucaja) da imaju prozore, odnosno message queue. S toga u zavisnosti od strukture tvog programa to mozda i ne bi bilo srecno resenje.
Uglavnom kao sto je gore navedeno, mozes da napravis svoj event ili ako koristis kompatibilnu funciju _beginthread() mozes jednostavno da iz napravljenog threada da pozoves _endthread().
[ Mikky @ 23.10.2002. 14:59 ] @
pa ja nisam rekao da treba da imaju prozore, PostThreadMessage()
salje poruku u msg queue koju posle skida GetMessage() a ne direktno u win proceduru, dakle prozor nije potreban vec samo msg loop
[ milanche @ 23.10.2002. 20:48 ] @
Resenje sa eventima radi odlicno u svim okruzenjima (C/C++/VisualC++/MFC) i u svim scenarijima.

MessagePump je podrzana striktno u Win32 okruzenju, gde se svakom worker thread-u moze dinamicki kreirati MessageLoop (a da mu se ne dodeljuje window).
U MFC okruzenju zahteva se malo drugaciji pristup, tj. zahteva se odluka
Worker vs. GUI thread odmah na pocetku, a cini mi se da su podrsku za GUI thread napisali malo muljavo i mutavo.

Najbolja diskusija u vezi ovog problema moze se naci u knjizi Jim Beveridge-a "Multihtreading Applications in Win32", koju od srca preporucujem kao bibliju za multithreading. Mala knjiga, ali suva esencija.
[ doomed @ 24.10.2002. 00:17 ] @
a ima li negde da se skine za DZ ta knjiga?...
[ Milan Aksic @ 24.10.2002. 02:27 ] @
Ne poznajem strukturu programa tako da ne mogu odredjenije da napisem, ali da, ne mora da ima dodeljen prozor. I pored toga ne preporucujem ovo jer postoje dosta elegantnija i bezbednija resenja (izmedju ostalih i gore navedena). Ukazao bih jos samo da ako se ipak koristi ova opcija, nisam siguran da bi u ovom slucaju mogla da se koristi bas WM_QUIT poruka vec WM_USER (ili visa definisana), i u MSG strukturi hwnd polje je NULL.