Poprawne tworzenie wątku i ich wykorzystanie.

dział ogólny

Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez GoldWolf » niedziela, 18 października 2009, 15:16

Piszę sobie prostą bibliotekę. Chciałem by była ona osobnym wątkiem dla aplikacji. Właśnie testowałem rozwiązanie z wątkiem i napotkałem problem. Pisząc wątek chciałem odciążyć proces główny aplikacji by się nie zawieszał. Jednak sama aplikacja się nadal zawiesza.
Tak się zastanawiam czy błędnie nie podchodzę do tematu. Mam bibliotekę w której mam 3 funkcje i wątek. Dokładnie mówię o tej
sytuacji. Jednak zastosowanie wątku nic nie daje, aplikacja i tak się zwiesi. Przez zwieszenie rozumiem, że jak nacisnę button1 to dopóki się nie zakończy wątek nie nacisnę buttona2. Jak rozwiązać tą sytuację.
Do tej pory pisałem jeden program, oparty na wątkach jest on notabene do ściągnięcia z serwisu. Była tam stara metoda wykorzystania wątków opisana w poradach Cyforwego i wszystko chodziło cacy. Teraz próbuję zastosować TThread i coś mi nie wychodzi.

Druga sprawa, która mnie zastanawia czy jak chcę pisać aplikacje oparte na wątkach nie lepiej zamiast funkcji stosować metody. Czyli zamiast:
Kod: Zaznacz cały
#ifndef biblioteka_hpp
#define biblioteka_hpp
#include <string>
#include "grafik.h"
//prototypy funkcji
std::string F1(std::string const lancuch);
std::string F2(std::string const URL);
void F3(std::string &lancuch);
void F4(std::string &lancuch);
//Klasa Wątek ----------------------------------------------------
class Watek : public TThread{
   //WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
   TForm4 *tForm;

protected:
   void __fastcall Synchro(void);
   void __fastcall Execute(void);

public:
   // __fastcall myThread(TForm1 *Form);
   //WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
   Watek(TForm4 *_form):TThread(true), tForm(_form){}
//   std::string Url, stronaWWW;
};
#endif
Stosować rozwiązanie:
Kod: Zaznacz cały
#ifndef biblioteka_hpp
#define biblioteka_hpp
#include <string>
#include "grafik.h"
//Klasa Wątek ----------------------------------------------------
class Watek : public TThread{
   //WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
   TForm4 *tForm;

protected:
   void __fastcall F1(void);
   void __fastcall F2(void);
   void __fastcall F3(void);
   void __fastcall F4(void);
   void __fastcall Execute(void);

public:
   // __fastcall myThread(TForm1 *Form);
   //WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
   Watek(TForm4 *_form):TThread(true), tForm(_form){}
//   std::string Url, stronaWWW;
};
#endif
Ostatnio edytowano poniedziałek, 19 października 2009, 19:55 przez GoldWolf, łącznie edytowano 1 raz
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez polymorphism » niedziela, 18 października 2009, 19:24

Jednak nie jest to odpowiedz, aplikacja i tak się zawiesi nawet jeśli nie będę czekać na zakończenie wątku.

To oczywiste, dokumentacja mówi jasno:

    ~TThread signals the thread to terminate and then waits for the thread to return before calling the parent class’s destructor.
Czyli usunięcie obiektu watek1 spowoduje wywołanie funkcji WaitFor (lub da efekt podobny do wywołania tej funkcji).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez Witold » poniedziałek, 19 października 2009, 11:34

polymorphism napisał(a):Czyli usunięcie obiektu watek1 spowoduje wywołanie funkcji WaitFor (lub da efekt podobny do wywołania tej funkcji).


To może: TThread::FreeOnTerminate & TThread::OnTerminate .
Dobrze opisane dla BCB, w PL: http://www.fizyka.umk.pl/~jacek/dydaktyka/rad/rad4_watki.pdf

Za ten post autor Witold otrzymał podziękowanie od:
GoldWolf
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez polymorphism » poniedziałek, 19 października 2009, 12:04

Witold napisał(a):To może: TThread::FreeOnTerminate & TThread::OnTerminate .

To jedna z możliwych i sensownych opcji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez GoldWolf » poniedziałek, 19 października 2009, 21:18

Witold napisał(a):
polymorphism napisał(a):Czyli usunięcie obiektu watek1 spowoduje wywołanie funkcji WaitFor (lub da efekt podobny do wywołania tej funkcji).


To może: TThread::FreeOnTerminate & TThread::OnTerminate .
Dobrze opisane dla BCB, w PL: http://www.fizyka.umk.pl/~jacek/dydaktyka/rad/rad4_watki.pdf

Akurat znam ten link ale przykład dla mnie jest za trudny.

Wystarczyło Google + FreeOnTerminate i otrzymałem. Nie zadziałało, ale oba kody są dobre. Nawet użycie samego watek1->resume działa poprawnie. Problem polegał na tym, iż synchronizowałem funkcję, która powiedzmy sobie ma trochę do wykonania za czym się zakończy. Czyli zamiast:
Kod: Zaznacz cały
//Metoda synchronizacji dla Wątku ------------------------
void __fastcall Watek::Synchro(void){
tForm->stronaWWW = F1(F2(tForm->Url));
F3(tForm->stronaWWW);
}
//Metody----Wątek -----------------------------------------
void __fastcall Watek::Execute(void){
Synchronize(&Synchro);
}
Należało zmienić na:
Kod: Zaznacz cały
void __fastcall Watek::Synchro(void){
stronaWWW = tForm->stronaWWW;
Url = tForm->Url;
}
//Metody----Wątek -----------------------------------------
void __fastcall Watek::Execute(void){
Synchronize(&Synchro);
stronaWWW = F1(F2(Url));
F3(stronaWWW);
Czyli wynikało by z tego, że nie trzeba synchronizować funkcji, a jedynie przekazywanie parametry dla tych funkcji. A ponieważ było to już wałkowane więc dorzucę ten bardzo istotny post o synchronizacji.

A jak wygląda sprawa odnośnie drugiego pytania?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez polymorphism » wtorek, 20 października 2009, 14:31

Drugie pytanie jest dziwne. To, że piszesz aplikacje wielowątkowe, nie zmusza cię w żaden sposób do zamieniania wszystkich funkcji w metody. Ważne, żeby wszystko miało jakiś logiczny układ. Jeśli funkcje są w sposób istotny powiązane z klasą, zrób je metodami.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez GoldWolf » wtorek, 20 października 2009, 17:06

Tylko ja ten wątek po to zrobiłem by było to spójną całością. Pytam raczej pod kątem budowy kolejnych bibliotek. Jeżeli buduje wątek po to by zaadoptować to dla tych funkcji. Dlatego się nad tym zastanawiałem. W klasach na razie raczkuje, więc warto zapytać jak to powinno wyglądać.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Poprawne tworzenie wątku i ich wykorzystanie.

Nowy postprzez polymorphism » wtorek, 20 października 2009, 18:56

Pytam raczej pod kątem budowy kolejnych bibliotek.

No to przydałoby się jeszcze nazywać klasy, funkcje bardziej opisowo. Nazwa Watek jest zbyt ogólna, zważywszy, że jest tam coś związanego z HTTP. Masz tam jeszcze jakieś F'y, które też niewiele mówią. Publiczny interfejs powinien jasny, spójny i logiczny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana


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 1 gość

cron