Auf Beendigung des letzten Threads warten...
-
@Swordfish sagte in Auf Beendigung des letzten Threads warten...:
Warum übergibst du überhaupt &argv[i] und nicht argv[i]?
Ja, das frage ich mich auch... Ich habe Teile von diesem myThread example aus einem Blog kopiert, ich glaube, derjenige wusste auch nicht bescheid...
-
Also, hier ist der Vollständigkeit halber noch mal das gesamte Programm:
#include <windows.h> #include <iostream> #include <string> #include <chrono> #include <thread> DWORD WINAPI myThread(LPVOID lpParameter) { using namespace std; char* argv = (char*)lpParameter; chrono::milliseconds ms1 = chrono::duration_cast<chrono::milliseconds>( chrono::system_clock::now().time_since_epoch()); SHELLEXECUTEINFO ShExecInfo = { 0 }; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = argv; ShExecInfo.lpParameters = ""; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); WaitForSingleObject(ShExecInfo.hProcess, INFINITE); chrono::milliseconds ms2 = chrono::duration_cast<chrono::milliseconds>( chrono::system_clock::now().time_since_epoch()); cout << argv << " : "; cout << GetProcessId(ShExecInfo.hProcess) << " : "; cout << (ms2 - ms1).count() << " Milliseconds" << endl; return 0; } int main(int argc, char* argv[]) { if (argc <= 1 || argc % 2 != 1) { return 0; } using namespace std; const int n1 = (argc - 1) / 2; HANDLE handles[n1]; for (int i = 1; i < argc; i += 2) { int sleepTime = atoi(argv[i + 1]); DWORD myThreadID; handles[(i - 1) / 2] = CreateThread(0, 0, myThread, argv[i], 0, &myThreadID); this_thread::sleep_for(chrono::seconds(sleepTime)); } WaitForMultipleObjects(n1, handles, TRUE, INFINITE); for (int i = 0; i < n1; i++) { CloseHandle(handles[i]); } return 0; }
Es funktioniert, aber ist es auch schön?