CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z TThread WaitFor

Problem z TThread WaitFor

problemy z funkcjonowaniem bibliotek, komponentów itp.

Problem z TThread WaitFor

Nowy postprzez poleka » środa, 6 lipca 2011, 15:22

Witam,
mam pewien problem na komputerze z dwurdzeniowym procesorem (na innym komputerze z jednordzeniowym procesorem kod działa jak tego oczekuje, oba na W7).
Prosty kod wątku:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
TNOLThread::TNOLThread(const char* path, bool suspend) : TThread(suspend)
{
  WinExec(path, 0);
}
//---------------------------------------------------------------------------
void __fastcall TNOLThread::Execute()
{
  int cpu;
  TStringList* sl;

  while(true){
    if(FileExists("NOL")){sl = new TStringList(); sl->LoadFromFile("NOL"); cpu = StrToInt(sl->Strings[0]);
       if(cpu != 0){this->ReturnValue = cpu; delete sl; break;}
       else{delete sl;}
    }
  }
}
//---------------------------------------------------------------------------
 

uruchamia mały program .net i sprawdza czy ten program zapisał wynik swojego działania do pliku, jeśli tak to ustawia ReturnValue i kończy Execute.
W konstruktorze formatki vcl tworzę ten wątek i zapomocą WaitFor czekam aż zakończy się Execute:
KOD cpp:     UKRYJ  
  TThread* w = new TNOLThread("path",false);
  int r = w.WaitFor();
 

Tak jak napisałem wcześniej, tan sam kod na dwóch komputerach działa inaczej. Na jednordzeniowym program nie uruchomi się zanim wątek nie skoczy działać, natomiast na dwurdzeniowym uruchomi się nawet przed stworzeniem pliku przez wywołany w wątku program. Nie wiem czy może być to spowodowane... .
Avatar użytkownika
poleka
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): niedziela, 13 lipca 2008, 20:52
Podziękował : 0
Otrzymał podziękowań: 0
    Windows 7Opera

Re: Problem z TThread WaitFor

Nowy postprzez polymorphism » środa, 6 lipca 2011, 17:13

No dobrze, ale w czym to przeszkadza, że program się uruchomi (i jak rozumiem zamknie) przed wątkiem? Wątek czeka na plik NOL, który - jak się domyślam - wygenerowany jest przez aplikację. Więc jeśli program zakończy się przed uruchomieniem wątku, to i tak ów wątek dostanie to, czego chce. Nie widzę problemu. No chyba, że to wszystko inaczej działa.

p.s. dlaczego WinExec nie przeniesiesz do Execute?
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: Problem z TThread WaitFor

Nowy postprzez poleka » środa, 6 lipca 2011, 18:31

Chodzi o to, że jak wywołuje ten wątek w konstruktorze formatki, i główny wątek nie poczeka na zakończenie TNOLThread (co niby ma czynić WaitFor) to, zmienna r dostanie wartość 0 (chyba to jest domyślna wartość ReturnValue klasy bazowej). Oczywiście wielkiego problemu nie ma, bo można użyć go bez WaitFor, dodać kod co ustawi wartość odpowiedniego pola w formatce i gotowe, ale myślałem, że wiem jak zachowuje się WaitFor.
Avatar użytkownika
poleka
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): niedziela, 13 lipca 2008, 20:52
Podziękował : 0
Otrzymał podziękowań: 0
    Windows 7Opera

Re: Problem z TThread WaitFor

Nowy postprzez polymorphism » środa, 6 lipca 2011, 18:55

Dobrze zrozumiałeś działanie WaitFor, funkcja ta czeka na zakończenie wątku. Mnie zastanawia coś innego, jak sens ma użycie wątka, jeśli tworzysz go i od razu czekasz na jego zakończenie, blokując przy tym wątek główny. Przecież to da taki sam efekt, jakbyś nie odpalał tego wszystkiego w oddzielnym wątku - taki przerost formy nad treścią.
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: Problem z TThread WaitFor

Nowy postprzez poleka » środa, 6 lipca 2011, 23:54

Po prostu jak bym chciał w konstruktorze zaraz po WinExec, umieścić kod wczytujący zawartość pliku, którego stworzenie zazwyczaj trochę trwa przez program poboczny, to takie podejście nie zadziała. Można by dać np. w onIdle lub onTimer, kod spr. czy jest już plik, jeśli tak to wczytaj i event handler na NULL lub na inną metodę... . Chodzi głównie o kwestię prezentacyjną, mój program wyświetla na głównej formatce w TListView pewne parametry i ich wartości. Jedną z nich jest wartość z wczytywanego pliku i nie chciałbym, żeby na początku programu było w tym miejscu puste miejsce albo 0.
Avatar użytkownika
poleka
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): niedziela, 13 lipca 2008, 20:52
Podziękował : 0
Otrzymał podziękowań: 0
    Windows 7Opera

Re: Problem z TThread WaitFor

Nowy postprzez polymorphism » czwartek, 7 lipca 2011, 09:58

Chyba mnie nie zrozumiałeś. Chodzi mi o to, że przy takim "wywołaniu" wątka wątek główny i tak będzie blokowany na czas tworzenia pliku, ponieważ tyle będzie trwało działanie wątku TNOLThread, a co za tym idzie blokowanie WaitFor. Zatem pozyskanie danych z pliku odbywa się w sposób synchroniczny, nie dając żadnych korzyści z użycia dodatkowego wątku.

p.s. zastanawia mnie jeszcze jedna rzecz, czy jak wątek główny wejdzie w "stan" wait-for, to metoda Synchronize będzie działać? Według mnie powinna, no ale...
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: Problem z TThread WaitFor

Nowy postprzez Cyfrowy Baron » czwartek, 7 lipca 2011, 15:33

poleka napisał(a):przez program poboczny,


Czy ten program poboczny, to może również program Twojego autorstwa i możesz go wyposażyć w dodatkowe funkcje?
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: Problem z TThread WaitFor

Nowy postprzez poleka » piątek, 8 lipca 2011, 11:21

Cyfrowy Baron napisał(a):
poleka napisał(a):przez program poboczny,


Czy ten program poboczny, to może również program Twojego autorstwa i możesz go wyposażyć w dodatkowe funkcje?


Tak
Avatar użytkownika
poleka
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): niedziela, 13 lipca 2008, 20:52
Podziękował : 0
Otrzymał podziękowań: 0
    Windows 7Opera

Re: Problem z TThread WaitFor

Nowy postprzez Cyfrowy Baron » piątek, 8 lipca 2011, 15:53

Skoro tak to wyposaż ten program poboczny w funkcję, która po zapisaniu pliku wyśle do programu drugiego informację o tym, że plik został utworzony. program drugi wyposaż w funkcję odbierającą takie informacje. Komunikacja może odbywać się poprzez linię komend.

► patrz serwis: Cyfrowy Baron dział:
porady -> różne -> Przekazywanie do programu argumentów z linii komend.
tematyczny spis porad -> Zablokowanie uruchomienia kopii programu z przekazaniem parametru do wcześniej uruchomionego i aktualnie działającego programu!
porady -> api -> Zablokowanie uruchomienia kopii programu - sposób drugi.
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


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

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

cron