Kombinuję z wykorzystaniem INDY i ściągnięciem pliku przez ftp na dany komputer.
Ten program powinien wywołać polecenie na danym hoście, zapisać wynik do pliku i ściągnąć go, a następnie zrobić to samo, ale na innym hoście.
Cyfrowy Baron napisał(a):jak pisałem funkcja WinExec nie jest do tego celu najlepsza, powinieneś używać funkcji CreateProcess. Opis znajdziesz w serwisie Cyfrowy Baron w dziale: porady API Uruchamianie programu z wybranym do edycji plikiem - sposób trudniejszy.
Cyfrowy Baron napisał(a):Nie rozumiem! Chcesz z komputera lokalnego uruchomić program na serwerze?
WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + " \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
Sleep(8000);
WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);
Sleep(2000);
Memo1->Lines->LoadFromFile("C:\\dane1");
DeleteFile("c:\\dane1");
if (FileExists("C:\\dane1")==true)
{
Memo1->Lines->LoadFromFile("C:\\dane1");
DeleteFile("c:\\dane1");
}
else
{
Memo1->Lines->Add("Brak dostępu do pliku);
}
Chciałbym pominąć 2 i 4, ale tak, żeby kolejne polecenie czekało na wynik poprzednika. Jak mogę to zrobić wykluczając sleep?
Druga sprawa - zastanawiam się dlaczego poniższy kod do obsługi pkt 5 i 6 nie działa prawidłowo?:
usunięcie pliku, czyli wartość true sprawiłoby pominięcie wyświetlenia wartości else.
4. Rozpoczyna się uruchomienie pętli, pliku brak i w tym momencie brak także komunikatu.
1. Wywołanie pierwszego procesu nie daje odpowiedzi w wyznaczonym czasie
3. Pierwszy nadal działa, drugi już skończył.
3. Oba przestały działać.
Cyfrowy Baron napisał(a):Jak długo ma działać ta pętla?
Jakiej odpowiedzi?
Użyj funkcji CreateProcess, która zatrzyma program aż do czasu zakończenia działania procesu z pkt. 1. Link z wcześniejszej porady.
Przypuszczam, że będzie 99 razy sprawdzać czy wyrażenie jest spełnione i wykona odpowiednią akcję, moim zdaniem za każdym razem. Mylę się?
Ciężko to sprecyzować, bo to aplikacja firmowa, ale ogólnie pierwszy punkt powoduje połączenie i zalogowanie do serwera, a następnie wydanie polecenia uruchamiającego skrypt. Gdy skrypt się wykona wynik zostanie zapisany do pliku i to oznacza koniec działania pierwszego polecenia.
Cyfrowy Baron napisał(a):Czyli aplikacja nie kończy działania?! Jeżeli tak, to CreateProcess na niewiele się zda, gdyż założenie było takie, że po uruchomieniu aplikacji program czeka, aż aplikacja się zamknie.
Jak wspomniałem wcześniej, pliki muszą się pojawić by pętla while przestała działać. Można by ewentualnie wprowadzić jakiś limit dla pętli, czyli np:KOD cpp: UKRYJWinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + " \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
int x = 0;
while(1)
{
if( FileExists( "lokalizacja pliku dane 1" ) || x >= 10000 )
{
return;
}
x++;
Sleep(10);// niewielkie opóźnienie dla pętli
}
WinExec(("C:\\program2.exe " + Edit1->Text + ":" + Edit2->Text + "@ip /command \"get dane1 c:\\\" \"exit\"").c_str(), SW_SHOW);
x = 0;
while(1)
{
if( FileExists( "C:\\dane1" ) || x >= 10000 )
{
return;
}
x++;
Sleep(10);// niewielkie opóźnienie dla pętli
}
Memo1->Lines->LoadFromFile("C:\\dane1");
DeleteFile("c:\\dane1");
To taka prowizorka, ale nie wiem z czym dokładnie mam do czynienia.
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 45 gości