Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 05:03

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Multithreading

Discussion on Multithreading within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
Multithreading

Guten Tag Leute,
Ich befasse mich seid ca 2 monaten immer mal wd mit c++ und probiere mich dran einfache Programme zu schreiben .
Nun aber wollte ich mich mal am multithreading versuchen da ich eine Schleife programmieren will die solange läuft bis der Benutzer einen button drückt oder Bei der konsole per eingabe die schleife stoppt.
Mir wurde gesagt ich soll eine globale Variable definieren was ich getan habe und dann die schleife in einen Threat packen soll .Mein Problem ist nun aber das ich mir etliche Tuts meist auf Englisch durchgelesen habe aber nicht ganz durchblicke.

Es wäre wirklich nett wenn jmd von euch mir ein beispiel machen würde und mir sagen würde was ich alles für den Threat benötige ( includes,code usw ) ich hoffe jmd kann mir da vlt helfen weil ich wie gesagt bei den Tuts dazu nicht wirklich durchblicke wie das geht.

Edit :Ich Programmiere in c++ und benutze den Dev c++ compiler
marykillsjane is offline  
Old 09/28/2012, 15:05   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
schmeiss dev c++ aus dem fenster und hol dir microsoft visual c++ express (ich unterstelle dir einfach mal, dass du unter windoof arbeitest).

hier ein beispiel für windoof:
Code:
bool DoRun = true;

DWORD WINAPI MyThread()
{
	for (int i = 1; DoRun; i++)
	{
		Sleep(1000);
		printf("\nDies ist der %d. Durchlauf...", i);
	}
	return 0;
}

int main(int argc, char** argv)
{
	HANDLE MyThreadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&MyThread, 0, 0, 0);
	system("PAUSE");
	// Beende Thread
	TerminateThread(MyThreadHandle, 0);
	// Sonstige interessante Befehle:
	// SuspendThread(MyThreadHandle);
	// ResumeThread(MyThreadHandle);

	// Oder: 
	// DoRun = false;
	system("PAUSE");
	return 0;
}
standardisierte threads gibts erst mit c++ 11, musst du mal googlen, wie das genau aussieht.
Dr. Coxxy is offline  
Thanks
1 User
Old 09/28/2012, 15:19   #3
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
Vielen dank erstmal für die Antwort werde den code heute abend mir nochmal genau angucken und ausprobieren da ich gleich noch weg muss.
Zu der entwicklungsumgebung ich habe visual c++ 2010 express allerdings finde ich es am anfang erstmal übersichtlicher mit dev c++ zu proggen ,da man sich in Visual c++ z.b. bei einer forms anwendung zwar alles an fenstern buttons usw zusammenklicken kann aber im endeffekt weiß ein anfänger wie ich nicht was die ganzen vordefinierten codes alles bewirken.Von daher möchte ich halt erstmal alles selbst an includes code usw schreiben um auch zu verstehen warum usw.
Natürlich kann ich mir in visual c++ 2010 auch einfach ein leeres Projekt anlegen, aber da gibt es dann für mich keinen unterschied ob ich das mit dev c++ oder mit visual mache ^^. Muss erstmal alles richtig lernen dann kann ich mich damit befassen welche entwicklungsumgebung besser für mich geeignet ist.

Edit: Habe noch nie mit der Win Api gearbeitet muss ich ein bestimmtes include noch mit einbinden?
marykillsjane is offline  
Old 09/28/2012, 15:22   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
leeres projekt machen und visual c++, der standardcompiler von dev c++ ist uralt und die ide an sich ist fürn...
Dr. Coxxy is offline  
Thanks
1 User
Old 09/28/2012, 16:30   #5
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Quote:
Originally Posted by marykillsjane View Post
Mir wurde gesagt ich soll eine globale Variable definieren
Nimm einen Stock und schlage diese Person. Feste. Oft.
MoepMeep is offline  
Thanks
1 User
Old 09/28/2012, 18:47   #6
 
elite*gold: 0
Join Date: Jun 2012
Posts: 187
Received Thanks: 58
Quote:
Originally Posted by Dr. Coxxy View Post
schmeiss dev c++ aus dem fenster und hol dir microsoft visual c++ express (ich unterstelle dir einfach mal, dass du unter windoof arbeitest).

hier ein beispiel für windoof:
Code:
bool DoRun = true;

DWORD WINAPI MyThread()
{
	for (int i = 1; DoRun; i++)
	{
		Sleep(1000);
		printf("\nDies ist der %d. Durchlauf...", i);
	}
	return 0;
}

int main(int argc, char** argv)
{
	HANDLE MyThreadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&MyThread, 0, 0, 0);
	system("PAUSE");
	// Beende Thread
	TerminateThread(MyThreadHandle, 0);
	// Sonstige interessante Befehle:
	// SuspendThread(MyThreadHandle);
	// ResumeThread(MyThreadHandle);

	// Oder: 
	// DoRun = false;
	system("PAUSE");
	return 0;
}
standardisierte threads gibts erst mit c++ 11, musst du mal googlen, wie das genau aussieht.
SuspendThread, TerminateThread und System() sind 3 funktionen die du niemals verwenden solltest, wenn du keinen guten Grund dafür hast.

Generell sollte man es besser so lösen:

Code:
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

DWORD WINAPI ThreadFunc( int &param )
{
	std::cout << "threadfunc called\n";
	while (param == 0)
	{
		std::cout << "threadloop!\n";
		Sleep(1000);
	}
	std::cout << "thread func end\n";
	return 0;
}


int main ( void )
{
	int iCondition = 0;
	DWORD dwThreadID = 0;
	
	HANDLE hThread = 0;
	hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc, &iCondition, 0, &dwThreadID);
	
	if (!hThread || !dwThreadID)
		return 1;

	std::cout << "Hit Enter to exit the thread\n";
	getchar();
	iCondition = 1;
	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);
	std::cout << "Hit Enter to exit the program\n";
	getchar();

	return 0;
}
tnd0 is offline  
Thanks
1 User
Old 09/28/2012, 21:42   #7
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
Ich habe nun das Beispiel von Dr.Coxxy genommen da es für mich als Anfänger einfacher zu verstehen war auch wenn es scheinbar wie du sagtest nicht die beste Variante ist.Vielen dank euch allen für die Hilfe das hat sehr gut geklappt mit dem Thread allerdings hätte ich noch ein paar Fragen undzwar :
Durch System("Pause"); wird ja darauf gewartet das der benutzer irgendeine Taste drückt um das Programm zu schließen wie kann ich das ganze nun so gestalten das die schleife im Threat beim drücken von einer von mir festgelegten Taste die schleife stoppt und bei einer anderen festgelegten Taste den Threat erneut startet?
Und die 2te Frage wäre warum werwenden manche std::cout und andere nur cout wo ist der unterschied?

Nochmal Vielen dank euch allen das ihr nem blutigen Anfänger wie mir helft mit dem Threat hat ja schonmal echt klasse geklappt
marykillsjane is offline  
Old 09/29/2012, 01:31   #8
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
std ist der namespace. Man kann nun entweder
Code:
using namespace std;
funktionsname();
nutzen oder
Code:
std::funktionsname()
Wenn man nicht genau weiß was man macht ist die 2. Variante eher zu empfehlen.

Das Beispiel von Dr.Coxxy ist, wie das meiste was er von sich gibt, kompletter schwachsinn. Das Beispiel von tnd0 ist da doch deutlich besser geeignet.

System("Pause"); solltest du unter keinen umständen verwenden. Wie du den Thread stopst weißt du ja nun. Und wie du einen neuen startest solltest du auch wissen Ich persönlich steuer meine Threads in der Regel über mehrere Zustände.
MoepMeep is offline  
Thanks
1 User
Old 09/29/2012, 01:42   #9
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by MoepMeep View Post
std ist der namespace. Man kann nun entweder
Code:
using namespace std;
funktionsname();
nutzen oder
Code:
std::funktionsname()
Wenn man nicht genau weiß was man macht ist die 2. Variante eher zu empfehlen.

Das Beispiel von Dr.Coxxy ist, wie das meiste was er von sich gibt, kompletter schwachsinn. Das Beispiel von tnd0 ist da doch deutlich besser geeignet.

System("Pause"); solltest du unter keinen umständen verwenden. Wie du den Thread stopst weißt du ja nun. Und wie du einen neuen startest solltest du auch wissen Ich persönlich steuer meine Threads in der Regel über mehrere Zustände.
Sehr witzig - not.

die sicherheitsbedenken und geschwindigkeitsnachteile von system sind bei diesem beispielcode nun wirklich vollkommen irrelevant.
TerminateThread ist nicht sauber, aber dafür gäbe es ja die DoRun variable, die ich auch eingebaut habe.
tnd0 hat diese laufzeitvariablenmethode verbessert indem er es als parameter in den thread weitergibt, richtig sauber wäre jetzt eine klasse, die den thread komplett abstrahiert, was ein beispiel eines threads aber bei weitem übersteigt.

Der te hat lediglich nach einem beispiel für einen thread gefragt, den ich ihm gegeben habe.
Dr. Coxxy is offline  
Thanks
1 User
Old 09/29/2012, 09:48   #10
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Anfänger fragt nach Beispiel - liefern wir ihm unsauberen Dreckscode! Aber hey, man muss C unbedingt for C++ lernen! Man sieht ja, was es dir anscheinend gebracht hat :|
MoepMeep is offline  
Thanks
1 User
Old 09/29/2012, 11:12   #11
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
Ich versuche mich grad auch am 2ten beispiel was ich daran aber grade nicht verstehe ist warum #define WIN32_LEAN_AND_MEAN definiert wird aber nirgends im weiteren Quelltext benutzt wird .
marykillsjane is offline  
Old 09/29/2012, 11:31   #12
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx


Define WIN32_LEAN_AND_MEAN to exclude APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets.

#define WIN32_LEAN_AND_MEAN
Das sorgt einfach dafür, dass im Windows Header weniger "Müll" miteingebunden wird.
Nightblizard is offline  
Thanks
1 User
Old 09/29/2012, 12:56   #13
 
elite*gold: 0
Join Date: Jun 2009
Posts: 132
Received Thanks: 37
Ich würde nicht die Win32 Api benutzen für MultiThreading. Natürlich funktioniert das alles,nur fehlen wichtige Funktionen fürs MultiThreading. C++ 11 oder boost enthalten OPP Element für Threads. Außerdem sollte man hier auch mal CriticalSections und Mutex erwähnen,da diese sehr wichtig sind wenn mehere Threads an einer Sache arbeiten sollen.
dasschild is offline  
Old 09/29/2012, 13:45   #14
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Falls dein Compiler C++0x unterstützt könntest du Threads so verwenden:
Code:
    
   #include <iostream>
   #include <thread>
   #include <chrono>

    void ThreadFunc() 
    {
        std::this_thread::sleep(std::chrono::seconds(1)); 
    }

    int main() 
    {
        std::thread Thread(ThreadFunc); //Start Thread

        Thread.join(); //Wait untill the thread finishes its work
        return 0;
    }
Quote:
Originally Posted by dasschild View Post
Außerdem sollte man hier auch mal CriticalSections und Mutex erwähnen,da diese sehr wichtig sind wenn mehere Threads an einer Sache arbeiten sollen.
Ich denke er wird erstweil auch ohne auskommen.
.SkyneT. is offline  
Thanks
1 User
Old 09/29/2012, 15:18   #15
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
Ich denke er wird erstweil auch ohne auskommen.
Jo. Wenn das Programm mal abstürzt.. Einfach neu starten. Dann gehts wieder die nächstens 100mal. :x
xNopex is offline  
Reply


Similar Threads Similar Threads
Vb.Net String für multithreading?
11/24/2011 - General Coding - 13 Replies
Hey, ich habe einen socket server mit multithreading und setze nach Class ein paar sachen wie z.b. Dim paketcommand2 as string = vbnullstring ich greife mit einem multithreading thread darauf zu und dann kommt immer Das ActiveX-Steuerelement 248dd896-bb45-11cf-9abc-0080c7e7b78d kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist. wie kann ich das ändern ohne es in jede Sub reinzuschreiben? da ich dort auch sachen gesetzt habe die von mehreren subs...
[C++] D3D Multithreading
08/24/2011 - C/C++ - 0 Replies
Sry kann closed werde. MfG
Multithreading
03/17/2010 - AutoIt - 16 Replies
$handle = DllCallbackRegister("_Threadstart"," ;int","ptr") $handlr = DllCallbackRegister("_Threadstard"," ;int","ptr") $dll = DllStructCreate("Char;int") DllStructSetData($dll,1,"hi") DllStructSetData($dll,2,1234) $ret = DllCall("kernel32.dll","hwnd", "CreateThread","ptr",0,"d word",0,"long",DllCallbackGetPtr($h andle),"ptr",DllStructGetPtr($dll)," ;long",0,"int*",0)...
C++ Multithreading + Klassen
01/16/2010 - C/C++ - 8 Replies
Mein Problem ist es , dass ich eine Klasse habe (nehmen wir als Beispiel Auto) und eine Funktion (Beispiel : BremswegBerechnen) habe , die aber in einem extra Thread laufen soll . Also so in etwa : . . . int main() { CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)BM W.BremswegBerechnen, 0, 0, 0);



All times are GMT +1. The time now is 05:03.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.