Ich habe ich Handgriff, der über stdinHandle = GetStdHandle(STD_INPUT_HANDLE)
, und ich habe separaten Thread, die solchen Code ausführen:win32: Wie stoppen Readfile (stdin | pipe)
while (!timeToExit) {
char ch;
DWORD readBytes = 0;
if (!::ReadFile(stdinHandle, &ch, sizeof(ch), &readBytes, nullptr)) {
//report error
return;
}
if (readBytes == 0)
break;
//handle new byte
}
wo timeToExit
std::atomic<bool>
ist.
Ich möchte diesen Thread von einem anderen Thread zu stoppen. Ich habe es versucht:
timeToExit = true;
CloseHandle(stdinHandle);
und Code hängt in CloseHandle
.
Der Code hängt, während das Programm von einem anderen Programm ausgeführt wird, das CreatePipe
und DuplicateHandle
verwendet, um die Eingabe meines Programms auf Pipe umzuleiten.
Also wie soll ich stoppen while (!timeToExit)..
Thread in win32 Weg? Oder vielleicht sollte ich einige wie while (!timeToExit)..
Thread ändern, um es möglich es zu stoppen?
aktualisieren ich über die Nutzung vor Aufruf von WaitForMultipleObjects
gedacht ReadFile
mit stdin und Ereignisse als Argument und Triggerereignis in anderem Thread, aber es gibt keine Erwähnung von anonymem Rohr wie möglich Eingang für WaitForMultipleObjects
plus I versucht, wenn stdin console, verbunden und es nutzlos (immer die Steuerung ohne Verzögerung) nach dem ersten Zeichen in die Konsole eingegeben, sieht aus wie ich muss ReadConsoleInput
in diesem Fall statt ReadFile
?
'WaitForMultipleObjects()' kann auch benannte oder unbenannte Pipes und Konsolen bedienen. – wilx
@wilx 'WaitForMultipleObjects' Griffe Dinge in seltsamer Art und Weise, wenn Prozess, der mein Programm schreibt 0 Bytes ausgeführt„geleitet“stdin, es dann zurück (nach dem ersten Aufruf)' WAIT_OBJECT_0', aber 'ReadFile' kann nicht einmal 1 Byte gelesen , so komme ich zurück auf die Problemstellung in Frage, wir haben 'ReadFile' auf Eingabe warten. – fghj
Schreiben Sie nicht 0 Bytes dann? – wilx