ShellExecute i iconv.exe problem z przekazaniem parametrów

dział ogólny

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » sobota, 19 czerwca 2010, 19:25

Darek_C++ napisał(a):
polymorphism napisał(a):Skąd to 10240?!.

a skąd te Twoje 10000 char buffer[10000];
moje to 10 * 1024
Dokumentacja się nie musi się od razu kłamać, bo pomyliłem z PHP gdzie jest to właśnie sleep(1) jedna sekunda.
----
Tak czy inaczej podany przez Ciebie kod sprawdza czy jest coś w rurze jednak wiesza program wiec nie jest prawidłowy...

Tutaj znalazłem coś o zawieszaniu programu przez PeekNamedPipe
http://www.duckware.com/tech/peeknamedpipe.html
ale i bez tej funkcji program się zawiesza przy odczytywaniu ...
Ostatnio edytowano sobota, 19 czerwca 2010, 19:26 przez Darek_C++, łącznie edytowano 1 raz
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez polymorphism » sobota, 19 czerwca 2010, 19:25

Tak czy inaczej podany przez Ciebie kod sprawdza czy jest coś w rurze jednak wiesza program wiec nie jest prawidłowy...

Przecież pisałem, że ten kod wzbudza pewne moje obawy, jak się później okazało trafne, dlatego też podałem algorytm, który powinien rozwiązać problem. Sprawdzałeś go?

a skąd te Twoje 10000

Z głowy.

---- DODANE ----


ale i bez tej funkcji program się zawiesza przy odczytywaniu ...

No bo ta funkcja na tym etapie nie jest problemem, tylko algorytm. Zresztą mam Win XP z SP2 i wszystko gra i buczy...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » sobota, 19 czerwca 2010, 19:38

Włączę się na chwilę.

Skoro funkcja ReadFile czyta plik o rozmiarze 41 000 bajtów a rozmiar bufora wynosi 10*1024 bajtów to pojemność zmiennej jest prawie cztery razy za mała.


BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);



lpBuffer - A pointer to the buffer that receives the data read from a file.
nNumberOfBytesToRead - The maximum number of bytes to read.



Wydaje mi się, że skoro funkcja ReadFile działa w pętli to może się zdarzyć, że gdy funkcja PeekNamedPipe wykonuje kolejny obieg to funkcja ReadFile blokuje dojście do pliku uniemożliwiając jego uaktualnienie, ale mogę się mylić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » sobota, 19 czerwca 2010, 19:51

A co powiesz na temat moich uwag, gdyż szczerze mówiąc nie sprawdzałem tego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez polymorphism » sobota, 19 czerwca 2010, 19:58

(...) to pojemność zmiennej jest prawie cztery razy za mała.

Dlatego to wszystko jest w pętli.

Wydaje mi się, że skoro funkcja ReadFile działa w pętli to może się zdarzyć, że gdy funkcja PeekNamedPipe wykonuje kolejny obieg to funkcja ReadFile blokuje dojście do pliku uniemożliwiając jego uaktualnienie, ale mogę się mylić.

W kodzie, który podałem PeekNamedPipe sprawdza tylko, ile mogę w danej chwili przeczytać bez blokowania (coś jak socketowy select), więc wywołanie ReadFile nie będzie blokować przy pustej rurze, ponieważ pętla zostanie wcześniej przerwana.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » sobota, 19 czerwca 2010, 20:05

Zauważyłem coś takiego, że po uruchomieniu kodu program się zawiesza i pojawia się proces php-cgi.exe którego zabicie w Menadżerze zadań Windows powoduje odblokowanie programu jednak dane wyczytane z rury mają ok 4,00 KB (bajtów: 4 099) przy zapisaniu jako plik a nie 40KB wiec nie są całkowicie wczytane. Przy zapisaniu z wyjścia CreateProces bezpośrednio do pliku mają ok 40KB.

polymorphism ja się z Tobą nie wykłócam tylko męczę się z pewnym problemem i liczyłem na pomoc ... podajesz kod który nie działa więc problem pozostaje nadal, a szkoda, bo już całkiem dużo zostało w tej kwestii osiągnięte..

Tu też jest o tym problemie:
http://www.codeguru.com/forum/archive/i ... 63149.html
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » sobota, 19 czerwca 2010, 22:01

Twoja koncepcja:
Kod: Zaznacz cały
char buffer[1024];
do
{
   PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL);
   ShowMessage("Są dane "+ (String) bytes_avail);
   if(bytes_avail == 0) return;
   ReadFile(hRead,buffer,1023,&bytes_read,NULL);
   out.append(buffer,buffer + bytes_read);

}while(1);

Tylko że od razu zawiesza program przy większej ilości danych z PHP nawet ani razu pętla się nie wykona. Wiec dlaczego tak się dzieje ?
-----------
Nawet bez pobierania danych w pętli nie idzie sprawdzić czy coś jest w rurze, bo też program się zawiesza.
Kod: Zaznacz cały
   if(PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL))
   {
      ShowMessage("Są dane "+ (String) bytes_avail);
   }

Coś mi się wydaje, że błąd jest gdzie indziej, ale już nie mam dziś do tego głowy. Oto caly kod który wiesza program:
Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   SECURITY_ATTRIBUTES sa;
    sa.nLength              =   sizeof  (   SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor =   NULL;
   sa.bInheritHandle       =   TRUE;

   HANDLE hRead;
   HANDLE hWrite;

   DWORD bytesRead;

   SECURITY_ATTRIBUTES sat;
   STARTUPINFO si;
    ZeroMemory( &si, sizeof(STARTUPINFO));

    si.cb = sizeof(STARTUPINFO);
   si.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
   si.wShowWindow = SW_HIDE;

   //Tworzenie potoku...
   sat.nLength  = sizeof(SECURITY_ATTRIBUTES);
   sat.lpSecurityDescriptor =  NULL;
   sat.bInheritHandle = TRUE;
   CreatePipe((PHANDLE)&hRead, (PHANDLE)&hWrite, &sat, NULL);

    /* wejście */
   si.hStdInput = CreateFile("E:\\php\\test.php",
                GENERIC_READ,
                FILE_SHARE_READ,
                &sa,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);

   /* wyjście */
   si.hStdOutput  = (PHANDLE)hWrite;
   si.hStdError  = (PHANDLE)hWrite;

   PROCESS_INFORMATION ProcessInfo;

   if(CreateProcess(NULL,
               "E:\\php\\php-cgi.exe",
                    NULL,
                    NULL,
                    TRUE,
               NORMAL_PRIORITY_CLASS,
                    NULL,
                    NULL,
                    &si,
                    &ProcessInfo))
    {
        WaitForSingleObject(ProcessInfo.hProcess,INFINITE); //<--- czekamy...
        CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);

   }
   DWORD bytes_read;
   DWORD bytes_avail;
   DWORD  dw,read;
   std::string out; //<--- to jest przykladowo

   if(PeekNamedPipe(hRead,NULL,0,NULL,&bytes_avail,NULL))
   {
      ShowMessage("Są dane "+ (String) bytes_avail);
   }


}


Twoja kolej skoro wiesz jak to rozwiązać to słucham...
-----------

Widzę, że "Tu" się blokuje
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
po zamianie tego na np
WaitForSingleObject(ProcessInfo.hProcess,1000);
Program się nie wiesza wiec ciekawe ze Twój program działał....
Masz teraz okazję to udowodnić stosownym kodem - działającym kodem.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » niedziela, 20 czerwca 2010, 07:15

Na tej stronie: http://forum.ks-ekspert.pl/topic/122563-delphi-uruchomienie-aplikacji-dosowej/ jest interesujący kod w C++.

Poza tym nie mam dobrych wieści. Jak wynika z opisów na wielu forach funkcja PeekNamedPipe i ReadFile w systemie WindowsXP nie będą działały prawidłowo.

Na jednym z nich znalazłem taką informację:


You can add some sleep between peeks to avoid too much CPU utilization:
WaitForSingleObject(hProcess, 100);

Perhaps it would be better to do overlapped I/O in a thread with
WaitForMultipleObjects, and wait until either the process finishes,
or the overlapped I/O triggers. Then you don't have to do polling.



Spróbuj tego może pomoże.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » niedziela, 20 czerwca 2010, 07:18

Ale jak już pisałem po zamianie w WaitForSingleObject(pi.hProcess, 0); program - kod działa zgodnie z oczekiwaniem :)
Nie rozumiem tylko kwestii, że gdy dane "szły" do pliku, a nie rury kod działał i z parametrem INFINITE, a przy wujściu na rurę się zawieszał.
Ostatnio edytowano niedziela, 20 czerwca 2010, 07:23 przez Darek_C++, łącznie edytowano 1 raz
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » niedziela, 20 czerwca 2010, 07:21

Darek_C++ napisał(a):Poza tym zasygnalizowałem konkretny problem z zwiszaniem programu w miejscu

Kod: Zaznacz cały
WaitForSingleObject(ProcessInfo.hProcess,INFINITE); //<--- czekamy...


INFINITE oznacza, że funkcja ma czekać w nieskończoność, co może powodować zawieszenie programu, jeżeli proces nie zostanie zakończony. Zamiast INFINITE możesz podać wartość liczbową określającą po ilu milisekundach proces ma zostać zakończony, wtedy program odblokuje się po zadanym czasie. 1000 = 1 sekunda.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » niedziela, 20 czerwca 2010, 07:25

Darek_C++ napisał(a):Ale jak już pisałem po zamianie w WaitForSingleObject(pi.hProcess, 0); program - kod działa zgodnie z oczekiwaniem :)


To wydaje się chyba naturalne. Zmniejszyłeś czas oczekiwania do 0, więc równie dobrze możesz usunąć tą funkcję. Oczekiwanie w nieskończoność o którym pisałem wcześniej, wiąże się z blokowaniem procesu do czasu zakończenia wykonywanej operacji, przez co kod znajdujący się poniżej nie mógł być wywołany, gdyż program cały czas czekał. Sugerowałbym funkcji WaitForSingleObject zadać jednak jakiś czas oczekiwania, by nie zdarzyła się sytuacja, gdyż rura będzie próbować czytać z pliku, którego nie ma.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » niedziela, 20 czerwca 2010, 07:27

Dodam jeszcze, że przy parametrze 0
WaitForSingleObject(pi.hProcess, 0);
proces też czeka na zakończenie uruchomionego PHP co można zaobserwował dając w kodzie PHP funkcje sleep(5); // 5 sekund jednym słowem całość działa zgodnie z oczekiwaniem :)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » niedziela, 20 czerwca 2010, 07:29

To że czeka to normalne, ale dlaczego 0 sprawia że czeka na zakończenie operacji na pliku?



...po chwili

Plik pomocy wyjaśnia to zjawisko:


If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.



Tak więc, gdy wartość argumentu dwMilliseconds wynosi 0, funkcja sprawdza stan obiektu i powraca natychmiast, jeżeli wartość jest INFINITE działa w nieskończoność. Nie ma więc w tym niczego odkrywczego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Darek_C++ » niedziela, 20 czerwca 2010, 07:37

To nie jest operacja na pliku, bo ja już nie testuje to z programem iconv.exe do zmiany kodowania plików, ale programem php.exe który wykonuje kod PHP z pliku zewnętrznego. Z kolei PHP uruchomione z kodem w którym jest funkcja sleep(5) musi czekać te 5 sekund zwłoki zanim może się jako program zakończyć.

-----
Ależ ja nie czuje się odkrywcą tylko piszę w jaki sposób rozwiązałem swój problem. Poza tym myślałem, że to właśnie INFINITE sprawia, że czeka kod czeka do zakończenia uruchomionego procesu, a podanie jakiegoś nie zerowego parametru spowoduje, że po tym czasie program ruszy dalej nie czekając na zakończenie uruchomionego procesu co w moim wypadku było by niewłaściwe.
Ostatnio edytowano niedziela, 20 czerwca 2010, 07:40 przez Darek_C++, łącznie edytowano 1 raz
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: ShellExecute i iconv.exe problem z przekazaniem parametrów

Nowy postprzez Cyfrowy Baron » niedziela, 20 czerwca 2010, 07:39

No, ale o takich zmianach to powinieneś pisać od razu, gdyż my tutaj zastanawiamy się co jest nie tak w testowanym kodzie, a Ty zwyczajnie zmieniłeś warunki eksperymentu, przez co my zastanawiamy się nad jednym, a Ty robisz zupełnie coś innego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości