1
Windows a jiné systémy / Vícevláknové programování ve Windows __beginThreadEx()
« kdy: 20. 03. 2021, 14:54:39 »
Ahoj,
prosím, neznáte tu někdo, jak správně používat přístup ke spouštění vláken z C++? (Windows Visual studio)
Kód níže funguje. Celý kód volám z main().
Problém, na který se potřebuju zeptat, je ten, že pokud nechám v kódu f-ci WaitForSingleObject a nechám aplikaci čekat na dokončení vlákna, aplikace po tu dobu zatuhne a čeká na vlákno.
Takto testem naspouštím např. 5 vláken a nechám je klidně počítat fibonacciho pro číslo 40. To si tedy počkám...
Prozatím spouštím kód jenom z cmd, ale chování z GUI by bylo identické.
Právě pro to jsem chtěl použít spouštění vláken a představoval jsem si, že aplikace v main() poběží dále a bude normálně reagovat na uživatelské vstupy.
Pokud už běží vlákna, aplikace nereaguje na uživatelský vstup.
Četl jsem, že f-ce WaitForSingleObject() se nemá vynechávat, že pak to prý není korektní ukončovací postup pro běžící vlákno.
Nebo se prostě vlákna nemají spouště z mainu?
Je na to nějaká finta?
Jak to udělat nejlépe?
Děkuji.
prosím, neznáte tu někdo, jak správně používat přístup ke spouštění vláken z C++? (Windows Visual studio)
Kód níže funguje. Celý kód volám z main().
Problém, na který se potřebuju zeptat, je ten, že pokud nechám v kódu f-ci WaitForSingleObject a nechám aplikaci čekat na dokončení vlákna, aplikace po tu dobu zatuhne a čeká na vlákno.
Takto testem naspouštím např. 5 vláken a nechám je klidně počítat fibonacciho pro číslo 40. To si tedy počkám...
Prozatím spouštím kód jenom z cmd, ale chování z GUI by bylo identické.
Právě pro to jsem chtěl použít spouštění vláken a představoval jsem si, že aplikace v main() poběží dále a bude normálně reagovat na uživatelské vstupy.
Pokud už běží vlákna, aplikace nereaguje na uživatelský vstup.
Četl jsem, že f-ce WaitForSingleObject() se nemá vynechávat, že pak to prý není korektní ukončovací postup pro běžící vlákno.
Nebo se prostě vlákna nemají spouště z mainu?
Je na to nějaká finta?
Jak to udělat nejlépe?
Děkuji.
Kód: [Vybrat]
#include <process.h>
#include <Windows.h>
h = (HANDLE)_beginthreadex(0, 0, &doMyWork, &n, 0, &threadId);
threadsVector.push_back(threadId);
cout << "New thread spawned with child function. ThreadID: " << threadId << endl;
WaitForSingleObject(h, INFINITE);
if(CloseHandle(h)){
cout << "Thread finished and terminated." << endl;
}