【发布时间】:2017-11-14 16:05:43
【问题描述】:
我需要实现一个程序,它使用信号量将打开的记事本窗口的数量限制为 10。我在 WM_INITDIALOG 中创建了一个信号量
semafor = CreateSemaphore(0, 1, 10, "semaphore");
每次我点击按钮打开一个新窗口时,我都会打开那个信号量。但是这并不能阻止我打开超过 10 个窗口。
这是我单击对话框中的按钮打开新窗口时的代码:
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_OK:
semafor = OpenSemaphore(SEMAPHORE_ALL_ACCESS, TRUE, "semaphore");
if (semafor == NULL) {
printf("Eroare deschidere semafor empty: %d \n", GetLastError());
ExitProcess(1);
}
BOOL b = CreateProcess("C:\\Windows\\System32\\notepad.exe",
NULL, NULL, NULL, TRUE, 0, NULL, NULL,
&si, &pi);
process[++i] = GetCurrentProcess();
if (b) {
dwWaitForChild = WaitForInputIdle(pi.hProcess, 2000);
switch (dwWaitForChild) {
case 0:
printf("Procesul fiu este ready!\n");
break;
case WAIT_TIMEOUT:
printf("Au trecut 2 sec. si procesul fiu nu este ready!\n");
break;
case 0xFFFFFFFF:
printf("Eroare!\n");
break;
}
WaitForMultipleObjects(i, process, TRUE, INFINITE);
iRasp = MessageBox(NULL, "Terminam procesul fiu?", "Atentie!", MB_YESNO);
if (iRasp == IDYES) {
if (TerminateProcess(pi.hProcess, 2)) {
DWORD dwP;
GetExitCodeProcess(pi.hProcess, &dwP);
printf("Codul de terminare al procesului fiu: %d\n", dwP);
ReleaseSemaphore(semafor, 1, NULL);
CloseHandle(pi.hProcess);
printf("\nProcesul fiu a fost terminat cu succes\n");
}
else {
//tiparim mesajul de eroare
TCHAR buffer[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0, NULL);
wsprintf(buffer, "TerminateProcess() a esuat cu eroarea %d: %s",
dw, lpMsgBuf);
MessageBox(NULL, buffer, "Eroare!", MB_OK);
LocalFree(lpMsgBuf);
}
} // rasp YES
}
else
printf("Eroare la crearea procesului fiu!\n");
return TRUE;
}
break;
}
return FALSE;
}
【问题讨论】:
-
这闻起来像XY Problem。您需要向我们提供有关您想要做什么的更广泛的了解。请edit您的问题并详细说明您想要做什么。
-
为什么需要为此使用信号量而不是简单的计数器变量?
标签: c++ windows winapi process semaphore