logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Delphi program główny + wąteki w jednym pliku pas?

lukzak2298 09 Maj 2006 23:39 1683 8
REKLAMA
  • #1 2610282
    lukzak2298
    Poziom 18  
    Posty: 667
    Pomógł: 5
    Ocena: 91
    Jak w temacie... Czy i jak da się napisać coś takiego?

    Chodzi mi o to jak np. napisać program żeby jeden z dłużej liczących buttonów był obsługiwany w osobnym wątku nie przymulając całej aplikacji.

    PROSZĘ O POMOC :(
  • REKLAMA
  • #3 2611382
    lukzak2298
    Poziom 18  
    Posty: 667
    Pomógł: 5
    Ocena: 91
    Wiem, znam to i dlatego pytam... Mam napisany już program - 2 tysiące linijek i trochę już ciężko mi sie połapać, jak utworzyłem taki wątek to bez przerwy jakieś błędy wyskakują. Niby działa ale nie zawsze. Program się wiesza, czasami XP chce wysyłać info o błędzie a jak skopiowałem na powrót wszystko odtwarzając stan pierwotny to okazuje się że wzzystko śmiga, tylko że blokuje funkcjonalność aplikacji na czas obliczeń wykonywanych po kliknięciu tego buttona. Dlatego pytam czy nie dało by się tego zrobić tak jakoś żeby poprostu obsługa 1 buttona była uruchamiana w wątku bez żadnych większych kombinacji, przenoszenia kodu do innych plików pas itd...

    I jeszcze jedno pytanie: czy wątek można utworzyć tuż przed jego uruchomieniem czy tak jak w tym przykładzie musi być w onshow?
  • REKLAMA
  • #4 2611690
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Oki, więc zerknij na ten projekt.

    Pozdrawiam...
    Załączniki:
    • Thread_Demo.rar (165.25 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #6 2611830
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    To chyba nie sprawdziłeś dokładnie. W aktualnym projekcie poprzez button Wątek tworzysz wątek, który dokonuje obliczeń i w momencie zakończenia generuje zdarzenie OnTerminate, informujące aplikację główną o zakończeniu obliczeń w wątku. W trakcie obliczeń (w tle) aplikacja główna jest do dyspozycji użytkownika (button Aplikacja).

    ps. Pliki archiwum posiadają tą samą nazwę ale różnią się zawartością i rozszerzeniem.

    Pozdrawiam...
  • REKLAMA
  • #7 2612672
    lukzak2298
    Poziom 18  
    Posty: 667
    Pomógł: 5
    Ocena: 91
    Zauważyłem. No już trochę lepiej (w znaczeniu bardziej zrozumiałe), tylko jak dla mnie to dalej jest ciężkie do zrozumienia, zaraz będe próbował zastosować u siebie...

    Jeśli można spytać... do czego jest ten fragment:

    procedure TWatek.SetName;
    var
      ThreadNameInfo: TThreadNameInfo;
    begin
      ThreadNameInfo.FType:=$1000;
      ThreadNameInfo.FName:='TWatek';
      ThreadNameInfo.FThreadID:=$FFFFFFFF;
      ThreadNameInfo.FFlags:=0;
      try
        RaiseException($406D1388,0,SizeOf(ThreadNameInfo) div sizeof(LongWord),@ThreadNameInfo);
      except
      end;
    end;


    Co on robi?





    PS Wszystko działa wyśmienicie!!!! W watek.pas dopisałem Form1.Button.click i nic nie musiałem kombinować! Wielkie dzięki, pozdrawiam!

    Tylko do czego jest to co wyżej?

    I jeszcze pytania:

    w tamtej starszej wersji były:

     JakisWatek:=TWatek.Create(true);


    i



      with JakisWatek do
      begin
        Terminate;
        WaitFor;
        Free;
      end;


    a w tej jest tylko:

      with TWatek.Create(False) do
        OnTerminate:=KoniecObl;


    To znaczy chodzi mi o to true i false i Free którego nie ma w 2-giej wersji. Proszęk wyjaśnij mi jeszcze co to za różnice :) w koniecobl niema niczego dotyczącego wątków...

    Dodano po 3 [godziny] 41 [minuty]:




    Co któreś zamknięcie programu wyskakują błędy jak na załączonych screenach. Prosze o pomoc, wyjaśnienie czego to jest przyczyną? Gdy nie było watków nie było też takich problemów!!! ;(
    Załączniki:
    • Delphi program główny + wąteki w jednym pliku pas? 2.jpg (17.54 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Delphi program główny + wąteki w jednym pliku pas? 1.jpg (10.63 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #8 2614274
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    1. Ustawienie parametrów identyfikacyjnych wątka
    2. W pierwszej wersji mamy kontrolę nad uruchomionym wątkiem poprzez zmienną globalną JakiśWątek. Możemy w dowolnym momencie przerwać działanie wątka (Terminate, WaitFor, Free). W drugiej wersji wątek tworzony jest tylko na czas obliczeń, po których ginie "śmiercią naturalną" :) informując nas o tym poprzez wygenerowanie zdarzenia OnTerminate, wskazującego na procedurę KoniecObl.
    3. True i False przy tworzeniu wątka informują o tym czy wątek ma być "uśpiony" czy nie
    4. Sprawdź działanie tego pogramu na "świeżym" systemie

    ps do pkt 4: Błąd, który u Ciebie występuje może być spowodowany użyciem w wątku kontrolki, która jest używana w aplikacji głównej, np w jednej chwili wątek i aplikacja główna korzysta z kontrolki (Edit1 itp.) Jeśli tak, musisz wprowadzić synchonizację dostępu do kontrolki.

    Pozdrawiam...

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji wielowątkowości w programie Delphi, gdzie jeden z przycisków wykonuje długotrwałe obliczenia w osobnym wątku, aby nie blokować interfejsu użytkownika. Przedstawiono przykładowy projekt z wątkiem tworzonym dynamicznie po kliknięciu przycisku, który wykonuje obliczenia w tle i sygnalizuje zakończenie przez zdarzenie OnTerminate. Omówiono różnice między tworzeniem wątku z parametrem Create(true) – wątek uśpiony do ręcznego uruchomienia – a Create(false) – wątek uruchamiany od razu. Podkreślono konieczność synchronizacji dostępu do kontrolek GUI, gdyż bez tego wątki mogą powodować błędy i zawieszanie aplikacji (np. wywołanie ShowMessage w wątku). Wyjaśniono także funkcję procedury SetName, która ustawia nazwę wątku dla celów identyfikacyjnych w debugerze poprzez specjalne wywołanie wyjątku. Wskazano, że wątki mogą być tworzone tuż przed ich użyciem, niekoniecznie w zdarzeniu OnShow. Ostatecznie potwierdzono, że zastosowanie wątku do obsługi przycisku jest możliwe w jednym pliku pas bez konieczności rozdzielania kodu, pod warunkiem prawidłowej synchronizacji i unikania bezpośredniego dostępu do kontrolek GUI z wątku.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA