Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Probleme mit Threads

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.12.2003, 20:25 Uhr
~Chris
Gast


Hi,
ich habe Probleme mit diesem Threadbeispiel:
www.fun-soft.de/showtopic.php?threadid=1272&time=1060112721

Die Sache ist die, daß die eigentliche ThreadFunktion global definiert ist und
es somit eine Fehlermeldung gibt, wenn ich die ThreadFunktion als Memberfunktion definiere:
Fehler:
C:\test.cpp(3136) : error C2664: '_beginthread' : Konvertierung des Parameters 1 von 'unsigned long (void *)' in 'void (__cdecl *)(void *)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein.

C:\Softwareentwicklung\Kopie von Temp_Entwicklung\Rekursion5\Rekursion1Dlg.cpp(3136) : error C2664: '_beginthread' : Konvertierung des Parameters 1 von 'unsigned long (void *)' in 'void (__cdecl *)(void *)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

Meine Threadfunktion muss aber als Memberfunktion definiert werden da in ihr wieder Memberfunktionen aufgerufen werden und die sonst nicht als Memberfunktionen identifiziert werden können.

Weiß nicht mehr weiter, bitte dringend um Hilfe

Dieser Post wurde am 09.12.2003 um 22:23 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2003, 21:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du musst die Memberfunktion als static definieren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2003, 21:58 Uhr
ao

(Operator)


... genau. Und die Memberfunktionen, die du aus der Threadfunktion heraus rufen willst und alle Memberdaten, die du verwendest, müssen ebenfalls static sein, sonst kompilierts nicht ("cannot use non-static members in static functions" oder so ähnlich).

Falls das nicht möglich ist, musst du der Threadfunktion den this-Pointer der Instanz hineinreichen. Diese ganzen beginthread-APIs haben normalerweise einen void*-Parameter, der als Input an die Threadfunktion übergeben wird. Der ist für sowas da.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2003, 22:05 Uhr
~Chris
Gast


Danke für die Antowrten !
Wie kann ich den this pointer der Instantz in die ThreadFunktion geben ?
Angenommen mein ThreadFunktion heißt so:

C++:
void test::threadFn(void *arg)
{
           CSocket socket1,socket2;
    
    char *pBuf = new char[1025];
    int iBufSize = 1024;
    int iRcvd;
}

void test::startThread(char start)
{
     test*obj = static_cast(arg);
    _ch = start;
    _beginthread(threadFn, 0, this); // "threadFn" OHNE Klammern!!!
}




Bearbeitung von Pablo:

WIE SCHWIERIG IST ES LINKS AUF [ CPP ] [ /CPP ] ZU KLICKEN? BITTEN CPP TAGS SELBER BENUTZEN


Dieser Post wurde am 09.12.2003 um 22:23 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.12.2003, 07:28 Uhr
Tommix



Hallo,

C++:
void test::threadFn(void *arg)
{
  test* pTest = (test*) arg;

  pTest->blabla();



Hoffe, ich habe die Frage richtig verstanden.

- Tommix
[cpp]
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2003, 11:00 Uhr
~Chris
Gast


Ja schon, aber ich arbeite da ja mit einem neuen Objekt meiner Klasse.
Ich erzeuge mit der Funktion blabla() ja einen Socket und da stürzt mir das Programm hier immer ab.

CSocket socket1,socket2;//ist globalo definiert
socket1.Create(port);

Wenn ich das ganze ohne Thread aufrufe, dann funktionierts einwandfrei;es kann also nicht an dem Zweizeiler liegen.

Was kann ich hier machen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.12.2003, 11:24 Uhr
~Chris
Gast


Ich habe jetzt eine Möglichkeit gefunden (hoffentlich ist das auch was amtliches und stabiles)

Das Problem war, das es ja bevor ich in der ThreadFn() ein neues Klassenobjekt erzeugt habe es ja schon eines gegeben hat.
Diese "erste" Objekt hat nun die Windows Socketunterstützung aktiviert und zwar mit:

AfxSocketInit();

Da ich nun mit einem neuen Objekt versucht habe einen Socket zu erstellen, hat natürlich die AfxSocketInit() nicht gegriffen;also hab ich die AfxSocketInit() einfach in die Funktion wo der Socket erstellt wird mir reingebaut - funktioniert.
Ich hoffe ich hab mir dadurch für später mal kein Eigentor geschossen (das ich jeztzt noc nicht absehen kann)jedoch ist die Sokcetkommunikation nur in dieser einen Funktion aktiv und auch Daten werden nur hier empfangen und gesendet.

Chris
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.12.2003, 12:53 Uhr
~Chris
Gast


Leider zu früh gefreut !
Ich kann jetzt die Threads starten und meine Funktionen aufrufen, jedoch
stürzt mir der 2.Socket im zweiten Thread ab - vermutlich weil ich lokal jeweils die AfxSocketInit() aufrufe.
Das war eigentlich der Grund, warum ich dachte mit 2 verschiedenen Thread könnte ich das Socketproblem lösen.
Ich beschreibs jetzt mal kurz.

Der erste Socket (Server und hat nix mit dem zweiten zu tun)horcht auf einem Port ob was reinkommt, verarbeitet das dann und schickt das Ergebnis zurück.

Der zweite Socket sendet nur bei bestimmten Ereignissen (z.B. speichern) dieses Element (CString) an einen bestimmten Rechner über einen bestimmten Port (nicht der gleiche wie beim ersten Socket).

Das ist das Problem, weil wenn der erste horcht kann der zweite nichts mehr senden, weil er absürzt. (schon bei socket2.Create(....))

Hat von euch jemand eine Idee wie ich das mit den Sockets hinbekomme ?
Vielleicht gehts ja auch ohne Threads !

Vielen Dank schonmal, Chris
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.12.2003, 13:54 Uhr
ao

(Operator)


@Chris:

Hast du mal die MSDN-Lib zu AfxSocketInit gelesen? Ich zitiere:

Zitat:

Call this function in your CWinApp::InitInstance override to initialize Windows Sockets.



Damit ist gemeint: genau einmal aufrufen!

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.12.2003, 16:56 Uhr
~Chris
Gast


Danke für den Hinweis !
Jedoch finde ich noch immer keine Lösung für mein Problem.
Ich möchte in meiner Anwendung eine SocketServer der horcht haben,
und gleichzeitig sollte diese Anwendung auch Strings an einen anderen Port senden.
Problem: wenn der Server horcht , dann kann ich an einen anderen Port nichts mehr verschicken !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: