gpt4 book ai didi

c++ - 创建过程不起作用

转载 作者:可可西里 更新时间:2023-11-01 11:40:37 26 4
gpt4 key购买 nike

我正在创建一个进程并向系统申请大量内核对象。我的代码是:

int main(){
//Cria processo para o Data Viewer Unit
LPSTARTUPINFOA si;
PROCESS_INFORMATION pi;

// Start the child process.
if(!CreateProcessA(
"E:\\Documents\\Faculdade\\Matérias\\Automação em Tempo Real\\TP 3\\DataViewerUnit\\Debug\\DataViewerUnit.exe", // Module name
NULL, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NEW_CONSOLE, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return 0;
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

LOG("Traffic System initiating...");
LOG("Keyboard commands:\n"
"0 - Changes the system mode to manual.\n"
"1 - Changes the system mode to automatic.\n"
"Spacebar - Swaps between buffer lock and unlock.\n"
"ESC - Terminates the program."
);

system("PAUSE");
isAutoMode = TRUE;
terminate_progam = FALSE;
terminate_TOU = FALSE;
bufferSpace = BUFFER_SIZE;
InitializeCriticalSection(&bufferCS);
system("PAUSE");
hMailslot = CreateFile(MAILSLOT, GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ASSERT(hMailslot, "Mailslot couldn't be created");

hHasPosition = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE,
(LPCWSTR)"HAS_POSITION");
ASSERT(hHasPosition, "Positions to write semaphore couldn't be created.");

hHasMsg = CreateSemaphore(NULL, 0, BUFFER_SIZE, (LPCWSTR)"HAS_MSG");
ASSERT(hHasMsg, "Messages to read semaphore couldn't be created.");

hBufferLockStatus = CreateEvent(NULL, true, true,
(LPCWSTR)"BUFFER_LOCK_STATUS");
ASSERT(hBufferLockStatus, "Lock status semaphore couldn't be created.");

hTimer = CreateSemaphore(NULL, 0, 1, (LPCWSTR)"REMOTE_UNITS_TIMER");
ASSERT(hTimer, "Timer semaphore couldn't be created.");

nextMsgToRead = 0;
nextPositionToWrite = 0;

for (int i = 0;i < RU_QUANTITY;i++) {
hRUs[i] = (HANDLE) _beginthreadex(NULL, 0, (CAST_FUNCTION)RUAction, (LPVOID)i, 0, NULL);
ASSERT(hRUs[i], "RU " << i << "could not be created.");
DEBUG("RU " << i << " created.");
RUTime[i] = generateTime(100, 200);
DEBUG("Remote Unit " << i << " interval: " <<
RUTime[i]);
}

HANDLE hTOU = (HANDLE) _beginthreadex(NULL, 0, (CAST_FUNCTION)TOUAction, NULL, 0, NULL);
ASSERT(hTOU, "Traffic Optimization Unit couldn't be created.");

bool isLocked = false;
int typed;
do{
typed = _getch();
switch(typed){
case CHAR0:
if(isAutoMode)
LOG("You changed the mode to manual.")
else
LOG("Mode is already manual.")
isAutoMode = false;
break;
case CHAR1:
if(!isAutoMode)
LOG("You changed the mode to automatic.")
else
LOG("Mode is already automatic.")
isAutoMode = true;
break;
case SPACEBAR :
if(isLocked){
isLocked = false;
SetEvent(hBufferLockStatus);
LOG("You unlocked the buffer.");
} else {
isLocked = true;
ResetEvent(hBufferLockStatus);
LOG("You locked the buffer.");
}
break;
Default:
break;
}
} while (typed!=ESC);
LOG("You typed ESC, the program will be finished.");
//Pede o fim das threads

terminate_progam = true;
// Importante para que as threads não fiquem
// travadas sem poder terminar.
SetEvent(hBufferLockStatus);
WaitForMultipleObjects(RU_QUANTITY, hRUs, TRUE, INFINITE);
terminate_TOU = true;
WaitForSingleObject(hTOU, INFINITE);


// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hHasMsg);
CloseHandle(hHasPosition);
CloseHandle(hBufferLockStatus);
CloseHandle(hTimer);

return 0;
}

我已经注释了几乎所有这些代码并且创建过程运行正常。当我留下超过 1 个内核对象时,程序停止运行并且 Windows Vista 显示一条消息“此程序停止运行...”。另一个进程只是一个 cout 说了些什么......

我想知道我的代码有什么问题。问候,莱安德罗·利马

最佳答案

您正在将未初始化的指针传递给 STARTUPINFO 结构。您需要声明一个 STARTUPINFO 结构,初始化它的字段,并传递一个指向它的指针。

关于c++ - 创建过程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com