Wątek w C++ builder

0

Mam taką funkcję:

DWORD WINAPI ThreadRECV(LPVOID lpParam)

i usiłuje utworzyć nowy wątek tak:

Thread = CreateThread(NULL, 0, ThreadRECV, 0, 0, &ThreadID);

ale wyświetla mi błąd:
[C++ Error] Nowekonto.h(58): E2034 Cannot convert 'unsigned long (__stdcall * (_closure )(void *))(void *)' to 'unsigned long (__stdcall *)(void *)'
oraz
[C++ Error] Nowekonto.h(58): E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'void')
w linii tworzenia wątku o co chodzi?

0

Pewnie ThreadRECV jest metoda jakiejs klasy. Zrob z niej funkcje lub metode statyczna. Mozesz tez pokombinowac z klasa TThread.

0

Podziałało ale teraz mam taki problem, że w funkcji wątku odwołuje się do elementów na formie np:
Forma->Edit1->Text;
to się kompiluje ale podczas wykonywania wyświetla mi się:
Project: ....... faulted with message: 'access violation at 0x00483634: read of adress 0xffffffff'. Process Stopped...
O co tym razem biega :) nie można się w wątku odwołać do składowych jakiejś klasy??

0

nie można się w wątku odwołać do składowych jakiejś klasy??

Nie powinno.

0
0x666 napisał(a)

nie można się w wątku odwołać do składowych jakiejś klasy??

Nie powinno.

cos nowego ;]

mozna tylko trzeba wiedziec ze w builshicie zeby odwolywac sie do obiektow VCL (metod) trzeba stosowac metode Synchronize albo stworzy w klasie TThread metode ktora bedzie mozna przeciazac a bedzie wywolywana w watku uzywajac metody Synchronize

0
Maker napisał(a)
0x666 napisał(a)

nie można się w wątku odwołać do składowych jakiejś klasy??

Nie powinno.

cos nowego ;]

Cytat był wyrwany z kontekstu, a chodziło oczywiście o VCL ;)

0

Hmm no tak czytałem coś o niej w helpie ale coś mi nie wychodzi. Wątek ten działał pod konsole ja go skopiowałem i przerobiłem na VCL. Teraz nie wiem jak to przerobić żeby działało :) w helpie znalazłem przykłady użycia wątków ale jakoś inaczej to wygląda. Mój kod jest taki:

    DWORD WINAPI static ThreadRECV(LPVOID lpParam)
    {
    //tutaj piszemy co ma robic watek po utworzemiu, czyli w naszym przypadku ma nasluchiwac gniazdo sClient i przetwarzac odebrane pakiety !
        if(recv(Nowe->sClient, Nowe->szPacked, strlen(Nowe->szPacked), 0) == SOCKET_ERROR)
        {
            MessageBox(NULL, "Błąd funkcji recv() w wątku !", "Bład programu", MB_OK | MB_ICONERROR);
            return 0;
        }
        AnsiString do_wyslania = "0x04" + Nowe->Haslo1->Text +"$" + Nowe->Email->Text;
        Nowe->ret = send(Nowe->sClient, do_wyslania.c_str(), do_wyslania.Length() , 0);
    //tutaj w miare postepow dopisze sie przetwarzanie odebranych pakietow !
    return 0;
    }

A wywołanie wątku:
Thread = CreateThread(NULL, 0, ThreadRECV, 0, 0, &ThreadID);
Pomoże ktoś to przerobić?

0

klasa TThread jak uzywasz builshita nie uzywaj funkcji z winapi w winapi za synchronizacje odpowiadaja funkcje WaitForObject MsgWaitForObject itd.. ale to nie to samo co w builshicie troche inaczej jest to rozwiazane takze jak chcesz utworzyc nowy watek zainteesuj sie klasa TThread. Nie mieszaj nigdy winapi z VCL bo raz powstaje Tobie wiekszy bajzel a VCL juz ma rozwiazana obsluge nowych watkow. Winapi stosuje sie tylko wtedy kiedy wynika to z ograniczenia komponentow wiec albo pisz w czystym winapi albo stosuj glupie VCL builshita jedno z dwoch.

co do Twojego pytania nie pamietam juz bo od dawna tego srodowiska nie uzywam(bo z przymusu only ;)) ale powinno jakos to isc tak:

class NowyWatek : public TThread
{
public:
__fastcall NowyWatek(bool wstrzymany) : TThread(wstrzymany)
{ 
}
private:
void __fastcall watek()
{
// tutaj caly kod VCL ktory ma zostac wykonany w nowym watku
}

void __fastcall Execute(void)
{
while(!Terminated)
{
   Synchronize(watek);
}
}
};
0
Maker napisał(a)

[...]ale to nie to samo co w builshicie troche inaczej jest to rozwiazane takze jak chcesz utworzyc nowy watek zainteesuj sie klasa TThread. Nie mieszaj nigdy winapi z VCL bo raz powstaje Tobie wiekszy bajzel a VCL juz ma rozwiazana obsluge nowych watkow. Winapi stosuje sie tylko wtedy kiedy wynika to z ograniczenia komponentow wiec albo pisz w czystym winapi albo stosuj glupie VCL builshita jedno z dwoch.

Ja rozumiem, że można nie przepadać za VCL i Builderem ale to nie znaczy, że można opowiadać takie bzdury :D Jak to nie można mieszać VCL z WinAPI??? Ja to robię baaaaaaardzo często i nic strasznego się nie dzieje (włącznie z wątkami ;)).

0

no bzudry to Ty chlopie opowiadasz mowiac ze nie powinno sie wywolywac nie powiedzialem ze nie mozna tylko burdel pozniej nieptorzebny powstaje ja tez mieszalem kod winapi ale tylko wtedy kiedy uwazalem ze to konieczne a takich przypadkow bylo niewiele no jak musialem napisac aplikacje drukujaca roznego rodzaju tekst obrazki itd musialem sie odniesc wtedy do winapi poniewaz komponent builshita nie byl az tak rozbudowany a wprawdzie mowiac w ogole do tego celu nieprzytosowany oferwal wylacznie drukowanie nie uwzgledniajac ustawien DPI w drukarce

BTW: pokaz mi gdzie napisalem: ze nie mozna mieszac najpierw naucz sie czytac a pozniej odpowiadaj... bo jedyna osoba ktora na razie bzdury gada jestes Ty...

0

No już nie moge :/ mam problem z zakresami. Raz wątek nie widzi zmiennych raz metoda formy nie widzi wątku :/ teraz znów jak już troche poprzestawiałem ten wątek w różne miejsca dostaje błąd:
[C++ Fatal Error] Project1.cpp(59): F1004 Internal compiler error at 0xc90e2a with base 0xc40000
[sciana] [sciana] [sciana] ehhhhh
Z tymi zakresami to jest tak, że w wątku chcę odnosić się do Formy ale jak zadeklaruje go ponad deklaracją tej formy to on nie widzi jej elementów. Jak wątek wstawie w clase formy to wywala ten błąd co powyżej a jak wstawie wątek poniżej klasy formy to nie moge utworzyć nowego wątku w metodzie klasy formy. Nawet jak przed klasą formy napisze class NowyWatek; nic to nie daje :/

0

no jescze nie mialem taklich problemow jak Ty najwidoczniej troche podstaw z OOP Tobie brakuje wiec radze najpierw poczytac o programowaniu obiektowym.

0

Ojoj Maker, wyluzuj trochę. Bez tych osobistych wyjazdów. :>

Co do mieszania WinAPI i VCL - można, czasem nie da się inaczej, ale najładniej zrobić tak, żeby wywołania WinAPI wyrzucić do jakiegoś osobnego modułu (dorzucić warstwę pośredniczącą). Wtedy np. portowanie aplikacji na Kylixa pod Linuksa będzie łatwiejsze.

Używanie synchronized jest wygodne, ale mało efektywne. Lepiej zrobić 1 wątek synchronized, który miesza na VCL, a pozostałe wątki komunikują się z nim w jakiś sposób (synchronicznie poprzez wywołania, albo asynchronicznie poprzez kolejki - różnie to można rozwiązać). To jest trochę trudne, ale daje najlepsze rezultaty.

0

niefektywnie to stosowac te poryte srodowisko ;]
co do mojego wyluzowania moze wyluzuje jak inni ludzie naucza sie czytac moje wypowiedzi ;]

0
Maker napisał(a)

no jescze nie mialem taklich problemow jak Ty najwidoczniej troche podstaw z OOP Tobie brakuje wiec radze najpierw poczytac o programowaniu obiektowym.

Hehe nie <ort>buj </ort>się o moje podstawy z OOP je już mam. Wszystko robie tak jak daaawno temu (oczywiście chodzi ogólnie o klasy nie o wątki) ale ten błąd mi wywala w project1.cpp na końcu pliku gdzie już nie ma nic poza znakami '\n' :) (a deklaracja wątku i jego użycie jest w nowy.h który jest dołączany do projektu) więc prosze mi tu nie mówić, że nie znam podstaw OOP ;P a błąd jest nadal ale może jakoś to rozwiąże. Jak to ktoś wyżej powiedział: bez osobistych wycieczek prosze.

0
Maker napisał(a)

BTW: pokaz mi gdzie napisalem: ze nie mozna mieszac najpierw naucz sie czytac a pozniej odpowiadaj... bo jedyna osoba ktora ort! bzdury gada jestes Ty...

No dobra. Mój błąd. Zamień nie można na nie powinno. Resztę podtrzymuję ;)

0

to wstaw definicje klasy watku jak i deklaracje w pliku ktory zwiera implementacje metod Formy, a jak chesz zeby Twoj kod byl bardziej przejrzysty. Tworzysz plik watek.h do niego wrzucasz sama definicje klasy watku, Tworzysz pozniej plik watek.cpp w nim dolaczasz plik watek.h i naglowek Twojej formy (*.h) oraz dajesz implementacje metod klasy watek a w pliku *.cpp formy dodajesz naglowek watek.h. Prosta koncepcja tworzenia programow wielomodulowych. Jak nie wiesz w pliku *.h przekazujesz interfejs (prototyp klasy), prototyp funkcji w pliku *.cpp umieszczasz deklaracje ciala klasy (interfejsu), deklaracje cial funkcji (ich implementacje) pozniej jak gdzies chcesz uzyc tych funkcji dolaczasz tylko ten naglowek *.h i dzieki niemu w danym pliku sa dostepne(widziane) kompilator zna ich definicje co to za funkcje co to za obiekty wie skad pochodza inaczej bedzie Tobie pierdzial takie bzdury ze nie wie co to za funkcja albo klasa metoda itd...
Mam nadzieje ze teraz jest to jasne...

BTW: niech ktos poprawi ten system logowania bo to juz staje sie meczace gdy probuje wyslac posta a wygasa moje logowanie wyswietla sie blad tylko zamiast tak jak powinno byc poprawnie: dialog z logowaniem abym mogl sie ponownie zalogowac i wyslac moj post...

0

Wiem, że jak chcę czegoś użyć to musze to zadeklarować ale o to chodzi że nie wiem jak bo jak umieszcze deklaracje ponad klasą formy to w wątku nie widzi tej formy. Czyli moge wtedy w formie utworzyć wątek ale w wątku nie moge się do formy odwołać. Usiłowałem napisać przed formą tylko class NowyWatek ale w formie mi pisze ze nie wie co to za struktura. Ehh już na klasach pracowałem nie raz. Pierwszy raz mam taki problem :/

0

Oki zrobiłem to inczej. Przekazuje sobie po prostu odpowiednie pola z formy przez konstruktor, nie musze się więc odwoływać do formy ale teraz kur** wstawiłem sobie tą klase na początku nowe.h i wywala mi błąd:
[C++ Error] watek.h(2): E2303 Type name expected w linijce z klamrą otwierającą dleklaracje klasy:

class NowyWatek : public TThread
{
0

Załącz

#include <Classes.hpp>

w pliku watek.h.

0

Fakt działa :) dzięki :)

0

ech napisalem Tobie czlowieku rozwiazanie problemu jakbys sie zastosowal to bys nie mial tego problemu ale widze ze nadal zamiast nauczyc sie czytac wy po prostu lubicie pod gorke isc classes.hpp nie musisz dolaczac do watek.h jak dolaczyles naglowek formy on juz zawiera Classes.hpp nie wiem co w tym skomplilkowango dodac w watek.h nie wiem unitjakies.h czy jak masz nazwany naglowek Twojej formy i pozniej do pliku *.cpp formy dodac watek.h i chlopie to dziala nie ma bata a Ty jakies konfiguracje nie wiadomo skad wziete i czym poparte robisz :|

0

No o to chodzi właśnie że nie chciało działać bo jak tak zrobiłem to w nowa.h nie mogłem w funkcji utworzyć wątku bo go nie widziało... w każdym razi tamto rozwiązanie jak to określiłeś "nie wiem skąd wzięte i czym poparte" działa i jest super.

0

bo w nowa.h nie miuales tworzyc watku tylko w formie w nowa.h miales miec podana sama definicje klasy watku ale juz to pomijam bo widze ze sie jednak nie zrozumielismy ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1