Witam,
Co zrobić aby działanie programu było podobne do poniższego przykładu:
http://cpw.net.pl/c++builder/artyku%C5%82/283/
Jednak w tym przypadku funkcja jest wywoływana w wątku, ponieważ w zależności od przełącznika odczytywana jest reakcja
potoku na przesłanie danych do niego (WriteFile()). Chciałbym aby to działało na zasadzie: 1. użytkownik coś wpisuje 2.
Tekst przesyłany jest do potoku 3. Działający wątek zczytuje wynik działania procesu.
Mam następujący kod:
void funkcja_dzialajaca_w_petli_watku_dopoki_mozna() // jesli mozna = false to watek dziala nadal oczekujac az
znowu bedzie mozna
{
// (...)
bool bResult;
char buffer[1024];
DWORD bytesRead = 1;
RtlZeroMemory(buffer, 1024);
buffer[1023] = 's'; // a to warunek pełnego bufora,
//while (!(bResult && bytesRead == 0)){
while ((buffer[1023] != '\0') && !(bResult && (bytesRead == 0))){
RtlZeroMemory(buffer, 1024);
Memo1->Lines->Append("Czytanie:"+AnsiString(i++));
bResult = ReadFile(hRead, buffer, 1023, &bytesRead, NULL);
mozna = bResult;
WaitForSingleObject(hRead, INFINITE);
RichEdit1->Lines->Add(buffer);
}
mozna = false; // bool mozna warunkiem działania funkcji
}
W tym przypadku chce wykorzystać program konsolowy, ale na początek chciałem przetestować na zasadzie interakcji z konsolą
więc tworzę proces:,
CreateProcess(NULL, "cmd", NULL, NULL, TRUE, NULL,NULL, NULL, &startupinfo, &pinfo);
Problem w tym, że w zależności od zastosowanych warunków pętli WHILE, kończy się ona na 2 sposoby:
- przebiega raz i na wyniku otrzymuje zaledwie pierwszą linijkę (Microsoft Windows XP [Wersja 5.1.2600])
2 lub za 2 przebiegiem blokuje się w miejscu:
bResult = ReadFile(hRead, buffer, 1023, &bytesRead, NULL);
co w konsekwencji uniemożliwia np. zamknięcie uchwytu hREad albo dalszej interakcji.
W przykładzie z linka jest ok, gdyż wszystko wykonuje się raz i nie w wątku. Po debugowaniu można się domyśleć, że chodzi tu o sposób przytrzymania akcji, dopóki ReadFile nie skończy swojego działania.
Jak przeprowadzić dokładne zczytywanie z potoku w wątku ?