uruchomienie odzielnej aplikacji

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
NiceFox
Pasjonat
Pasjonat
Posty: 454
Rejestracja: 05 lis 2009, 13:22

Nieprzeczytany post autor: NiceFox »

Konflikt bedziesz miał. Możesz zastosować opóźnienie, jedna aplikacja korzysta z pliku a potem druga.
Pieniądze rosną na drzewie cierpliwości.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

fxBobi pisze:Aplikacja jest konsolowa. Jeśli uruchamiam aplikacje ręcznie wszystko jest w porządku. Pojawia się okienko konsoli i wykonywany jest algorytm.
Co to znaczy dokładnie, że aplikacja jest konsolowa?
Ta aplikacja to plik wykonywalny czy może jakiś skrypt .bat lub .cmd ?
W tym drugim przypadku uruchomić trzeba ją ciutkę inaczej ......

Druga sprawa: jeśli jako drugi parametr do WinExec podajesz 0 to nie dziw się, że "nic się nie dzieje". 0 oznacza, że okno aplikacji ma zostać ukryte. Podaj tam 1 albo 5.

Jeśli obie aplikacje będą korzystać z tego samego pliku to konflikt oczywiście może się zdarzyć. Można z tym sobie radzić na różne sposoby: najlepiej poprzez synchronizację dostępu do zasobu (mutex lub event) albo prościej: obsługując błędy przy otwarciu pliku i próbując otworzyć go do skutku (druga aplikacja musi w końcu go zwolnić).
Green
Obrazek
Obrazek

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Dakhr
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 14 lis 2009, 11:05

Nieprzeczytany post autor: Dakhr »

fxBobi pisze:Czy mogę was prosić jeszcze o pomoc?


Aplikacja jest konsolowa. Jeśli uruchamiam aplikacje ręcznie wszystko jest w porządku. Pojawia się okienko konsoli i wykonywany jest algorytm.
Konsola tak jak powyzej napisal Tigr, przyklad w mql4:

Kod: Zaznacz cały

#define SW_HIDE             0  //0-ukryte okno,1-pokaz okno
#import "shell32.dll"
int ShellExecute(int hWnd,int lpVerb,string lpFile,string lpParameters,int lpDirectory,int nCmdShow);

#import
    ShellExecute(0,0,"aplikacja.exe","-jakis parametr aplikacji",0,SW_HIDE);
wiecej o parametrach ShellExecute tutaj:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Awatar użytkownika
fxBobi
Gaduła
Gaduła
Posty: 244
Rejestracja: 20 sie 2008, 18:43

Nieprzeczytany post autor: fxBobi »

Jeszcze w tej pierwszej metodzie wpisałem 4 i się aplikacja uruchamiała ale gdy napisałem inny program (w konsoli) i zmieniłem ścieżkę to aplikacja sie nie uruchamia.

Wyszko wygląda mniejwiecej tak .

Kod: Zaznacz cały

//#import "kernel32.dll"
//int WinExec(string NameEx, int dwFlags);
//#import
#define SW_HIDE             1  //0-ukryte okno,1-pokaz okno
#import "shell32.dll"
int ShellExecute(int hWnd,int lpVerb,string lpFile,string lpParameters,int lpDirectory,int nCmdShow);
#import
     
     
int start()
  {
   Comment(TerminalPath());
   //string appPath = "c:\Program Files\CCleaner\test.exe";
   //WinExec(appPath,1);
   ShellExecute(0,0,"c:\Program Files\CCleaner\ccleaner.exe",NULL,0,SW_HIDE);
   return(0);
  }

Komentarzami odznaczyłem pierwszą funkcje której aktualnie nie stosuje .Ale i ta pierwsza funkcja jak napisałem wyżej po zmianie parametru przy appPath zadziałała.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

luktom pisze:Poprzez TerminalPath() możesz odczytać katalog bieżącej instancji MT4.

A co do ścieżki do aplikacji to zwróć uwagę, czy nie zawiera spacji, a jeśli tak to escape'uj całą ścieżkę w dodatkowe " " i \.

Kod: Zaznacz cały

string appPath = ""C:\\Program files\\Terminal\\experts\\app.exe"";
WinExec(appPath,0);

Kod: Zaznacz cały

string appPath = "c:\\Program Files\\CCleaner\\test.exe";
lub

Kod: Zaznacz cały

""c:\\Program Files\\CCleaner\\test.exe""
musisz używać dodatkowego Jeden '\' w C podobnych językach oznacza wystąpienie znaku specjalnego aby był interpretowany dosłownie muszą być dwa '\\' .
I na początek użyj SW_SHOW lub SW_SHOWNORMAL :

Kod: Zaznacz cały

ShellExecute(0,0,"c:\\Program Files\\CCleaner\\test.exe",NULL,0,   /*->*/ SW_SHOW);
parametr ostatni ustawiony na SW_HIDE to żądanie ukrycia okna ...
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
fxBobi
Gaduła
Gaduła
Posty: 244
Rejestracja: 20 sie 2008, 18:43

Nieprzeczytany post autor: fxBobi »

Nie udało mi się uruchomić oddzielnej aplikacji przez MT4.
Wiec tymczasowo(będę jeszcze próbował) zrobiłem to na eksport danych do pliku.

Aplikacja C++ w danym odcinku czasowym sprawdza zawartość pliku.Wiec nie obawiam sie że dojdzie do konfliktu między MT4 a programem. Tylko nie wiem dlaczego tak prosta aplikacja korzysta z 100% CPU
Co bardzo mi spowalnia PC .
Co może być powodem ?
Nie jestem teoretykiem wiec program ma na celu wyłączenie PC jest napisany w Dev C++ w aplikacji konsolowej.

W kodzie użyłem funkcji moze to jest powodem ?

Kod: Zaznacz cały

void pause ( int liczba_sekund )
	{
  	clock_t a;
  	a = clock () + liczba_sekund * CLOCKS_PER_SEC ;
  	while (clock() < a) {}
}
Może ona spowalnia , chociaż zastopiłem to Sleep() z biblioteki windows.h i efekt jest taki sam .

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Taka funkcja nie nadaje się.
W pętlach stosuje się Sleep()

Kod: Zaznacz cały

VOID Sleep(

    DWORD dwMilliseconds 	// sleep time in milliseconds 
   );
Parametr określa czas wstrzymania wątku w milisekundach
pozwala na oddanie czasu procesora innym wątkom .
Wystarczy Sleep(2) ..
Może ona spowalnia , chociaż zastopiłem to Sleep() z biblioteki windows.h i efekt jest taki sam .
Niemożliwe , może masz jeszcze jakąś pętlę ?
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
fxBobi
Gaduła
Gaduła
Posty: 244
Rejestracja: 20 sie 2008, 18:43

Nieprzeczytany post autor: fxBobi »

Użyłem funkcji Sleep() i wszystko działa.

ODPOWIEDZ