threads mit visual c++

Diskutiere threads mit visual c++ im Developer Network Forum im Bereich Hardware & Software Forum; wie kann man einen thread erzeugen und starten, zb zum kopieren von dateien danke
  • threads mit visual c++ Beitrag #1
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
wie kann man einen thread erzeugen und starten, zb zum kopieren von dateien

danke
 
  • threads mit visual c++ Beitrag #2
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

also die Thread-Funktion muss so aussehen :
UINT Receive_ThreadProc( LPVOID pParam)
{
...
return 0; // oder anderer Wert.
}


Gestartet wird das ganze wenn du MFC benutzt :
CWinThread *pThread;
pThread = AfxBeginThread( Receive_ThreadProc, this);


Der zweite Parameter kann irgend ein Long-Wert sein, der in pParam (LPVOID) übergeben wird. Stör dich nicht am LPVOID. Es ist nichts weiter als ein 32-Bit Wert.

Benutzt du keine MFC dann schau in der Online-Hilfe nach _beginthread . Ist fast identisch mit AfxBeginThread.

Tip : Mit WaitForSingleObject( pThread->m_hThread, INFINITE); wird solange gewartet, bis der Thread beendet ist. Statt INFINITE kannst du auch eine Zeit in ms angeben.


...yks ;)
 
  • threads mit visual c++ Beitrag #3
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
das klingt recht einfach, doch bei mir kommt folgende fehlermeldung :

error C2665: 'AfxBeginThread' : Durch keine der 2 Überladungen kann Parameter 1 vom Typ 'UINT (LPVOID)' konvertiert werden

hoffe das du mir da weiterhelfen kannst

danke
 
  • threads mit visual c++ Beitrag #4
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

hmm, ist der Text den du angegeben hast zu C2665 richtig übersetzt? Der Compiler spuckt doch alles in englisch aus.
Versuch mal
AfxBeginThread( Receive_ThreadProc, (long)this);
oder erstmal auch nur
AfxBeginThread( Receive_ThreadProc);


...yks ;)
 
  • threads mit visual c++ Beitrag #5
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
hab ne deutsche version von VC++.Net

auch nach diesen beiden Varianten, die gleiche Fehlermeldung :-(
 
  • threads mit visual c++ Beitrag #6
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Sieht so aus, als stimmt der erste Parameter, also die Adresse der Thread-Funktion, nicht. Die Thread-Funktion muß so aussehen:

UINT MyControllingFunction( LPVOID pParam );

Dann mach einfach einen Cast des ersten Parameters, also so:
AfxBeginThread((AFX_THREADPROC)&MyControllingFunction, (LPVOID)0);
 
  • threads mit visual c++ Beitrag #7
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

also ich benutze kein Cast und bilde mit & auch nicht die Adresse. Bei mir funtzt das ganze so wie oben beschrieben.
Sag arbeitest du mit der MFC (C++) oder schreibst du 'ne Konsolen-App (C).
Was noch sein kann. Liegt die Thread-Funktion noch von dem AfxBeginThread oder dahinter. Und wenn dahinter hast du die Thread-Funktion einmal am Anfang bekannt gemacht?

...yks ;)
 
  • threads mit visual c++ Beitrag #8
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
habe die Thread-funktion vor AfxBeginThread gschrieben, es kommt immer wieder die oben genannte Fehlermeldung
es gibt irgendwie ein problem mit dem ersten parameter :-(

übrigens ich benutze die MFC C++
 
  • threads mit visual c++ Beitrag #9
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
  • threads mit visual c++ Beitrag #10
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
kannst ja mal den teil deines progs hier reinstellen, so dass es funzt, ich übernehm ihn in meinem prog und dann werd ich mal sehen was er dann ausspuckt

danke
 
  • threads mit visual c++ Beitrag #11
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

das da oben ist Teil meines Programmes! Es funtzt bei mir so.

...yks ;)
 
  • threads mit visual c++ Beitrag #12
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
wie sieht eigentlich deine headerdatei aus, hab in einem buch gelesen die funktion

UINT threadProc (LPVOID pParam)

muss static sein, ist das so ?
 
  • threads mit visual c++ Beitrag #13
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Ich habe mal eben einen kleinen Test gemacht:
Per MFC-Wizard eine Dialog-App namens CMFCThreadTestDlg erzeugt, einen Button "Test" und den entsprechenden ON_BN_CLICKED-Handler hinzugefügt. Hier die relevanten Teile:

Code:
Code:
UINT  MFCThreadTestDlg::MyThreadProc(LPVOID pParam)
{
	for (int i = 0; i < 3; i++)
	{
		::MessageBeep(-1);
		Sleep(1000);
	}

	return 0;
}

void CMFCThreadTestDlg::OnTest() 
{
	AfxBeginThread(MyThreadProc, 0);
}
Header:
Code:
class CMFCThreadTestDlg
{
...
    static UINT MyThreadProc( LPVOID pParam );
...
}
Funktioniert ohne Probleme.

Wenn die Threadfunktion Member einer Class ist, dann MUß sie static sein. Einer normalen Memberfunktion wird nämlich intern immer ein Zeiger auf das Objekt als erster Parameter übergeben. Bei static Members ist das nicht der Fall.

Der Thread in meinem Beispiel ist übrigens ein "Worker Thread", der wegen fehlendem Message-Handling keine eigene GUI haben kann. Dafür sind dann "User-Interface Threads" zuständig. Aber da schaust Du besser mal in die MSDN oder besorgst Dir ein gutes Buch.
 
  • threads mit visual c++ Beitrag #14
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

jetzt ist alles klar :(.
Meine Thread-Funktion ist nämlich keine Member-Funktion sondern eine globale Funktion :rolleyes:.

Siehst du darin das ich

UINT Receive_ThreadProc( LPVOID pParam)

und nicht

UINT Klassenname::Receive_ThreadProc( LPVOID pParam)

habe!


...yks ;)
 
  • threads mit visual c++ Beitrag #15
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Original geschrieben von yks jetzt ist alles klar :(.
Meine Thread-Funktion ist nämlich keine Member-Funktion sondern eine globale Funktion
Das ist egal. Du kannst genauso gut eine globale Funktion als Thread-Funktion nehmen. Die muß dann auch nicht "static" sein.

Mach in meinem Beispiel das "CMFCThreadTestDlg::" vor "MyThreadProc(LPVOID pParam)" und die Zeile im Header raus. Geht genauso.
 
  • threads mit visual c++ Beitrag #16
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
das klingt doch schon mal gut, aber wo kann man bei vc++ eine globale funktion hinzufügen, wenn ich das mit dem assi mache , macht der mir doch ne memberfunktion, oder muss ich da irgendwas noch angeben ?
 
  • threads mit visual c++ Beitrag #17
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Original geschrieben von geausg
das klingt doch schon mal gut, aber wo kann man bei vc++ eine globale funktion hinzufügen, wenn ich das mit dem assi mache , macht der mir doch ne memberfunktion, oder muss ich da irgendwas noch angeben ?
Ob Du eine static Memberfunktion nimmst oder eine globale Funktion, ist egal und hängt von dem Konzept ab, das dem Programm zugrunde liegt.

Eine globale Funktion schreibst Du einfach direkt in den Source rein:
Code:
UINT MyThreadProc(LPVOID pParam)
{
	for (int i = 0; i < 3; i++)
	{
		::MessageBeep(-1);
		Sleep(1000);
	}

	return 0;
}

Und am Anfang des Sourcefiles machst Du die Deklaration:
Code:
UINT MyThreadProc(LPVOID pParam);
Besser wäre es natürlich, die Deklaration in ein extra Headerfile zu packen, in dem Du alle globalen Funktionen sammelst. Dasselbe gilt auch für Globale Funktionen. Aber dann mußt Du auch mit "extern" hantieren. Deshalb erstmal auf die einfache Art.
 
  • threads mit visual c++ Beitrag #18
G

geausg

Bekanntes Mitglied
Dabei seit
03.07.2002
Beiträge
88
Reaktionspunkte
0
erst mal vielen dank an alle

ok das funzt :)

jetzt folgende sache, ich möchte komplette verzeichnisse kopieren (deshalb das mit den threads) aber dabei den status (dateiname oder so) auf meinem hauptfenster ausgeben, ich muss also zugriff auf die variablen der klasse haben, damit ich zb. in einem edit-fenster was ausgeben kann

wie stellt man das am einfachsten an
 
  • threads mit visual c++ Beitrag #19
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Da gibt es auch mehrere Möglichkeiten. Die einfachste ist vielleicht folgende:

Du machst eine Struktur, in der alle Infos stehen, die Du anzeigen lassen möchtest. Diese Struktur muß vom Worker-Thread und vom Hauptprogramm aus, zugreifbar sein.

Wenn sich nun was getan hat, dann trägt der Thread die aktuellen Werte in die Struktur ein und schickt per PostMessage() eine (selbstdefinierte) Nachricht an das Hauptfenster, damit dieses die neuen Daten holen und anzeigen kann.

Damit bei gleichzeitigen Zugriff auf die Struktur alles in geregelten Bahnen abläuft, solltest Du den Zugriff darauf über wenige Funktionen laufen lassen und diese mit einer CriticalSection sichern.

In der MSDN findest Du alle notwendigen Infos zu PostMessage und CCriticalSection.
 
  • threads mit visual c++ Beitrag #20
yks

yks

Bekanntes Mitglied
Dabei seit
21.01.1999
Beiträge
551
Reaktionspunkte
0
Ort
Hamburg
Hi,

Originally posted by UnimatrixZero
Damit bei gleichzeitigen Zugriff auf die Struktur alles in geregelten Bahnen abläuft, solltest Du den Zugriff darauf über wenige Funktionen laufen lassen und diese mit einer CriticalSection sichern.

das ist programmtechnisch einwandfrei und sauber. Aber von der Performance nicht die beste Lösung.

Ich würde das ganze über einen Mailslot realisieren. Worker-Thread sendet grundsätzlich in den Mailslot. Das Hauptprogram öffnet z.B. einmal pro Sekunden den Mailslot liest ein Statusdatensatz und schliesst den Slot wieder. Vorteil : Hohe Performance für den Worker-Thread. In der Mailslot können sich die Nachrichten auch nicht stauen, denn wenn der Slot nicht geöffnet ist vom Empfänger, werden die Nachrichten verworfen.
Willst du keine Nachrichten verlieren möchtest, dann über (Message-)Pipes


...yks ;)
 
Thema:

threads mit visual c++

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben