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 :
Das funktioniert aufgrund meiner momentanen Situation nicht
(Ich will den Code ja nicht für die Klasse Auto haben , sondern für eine andere bereits vorhandene Klasse , würde ich aber mein Code hier posten , würde das den Rahmen sprengen , da er recht umfangreich ist und sehr viele verwirren wird , weil darin Funktionen enthalten sind , die eig. nur sehr wenige kennen dürften)
Ich habe es bereits mit der "Klasse" Boost von dieser Seite probiert :
Leider kommen bei meinem Compiler ein paar Errors (ich benutze wxDev-C++ , mit VC++ habe ich die Klasse noch nicht probiert , da ich eigentlich nur sehr ungerne auf VC++ umsteigen möchte , vorallem weil mir die wxDev-C++ so sehr ans Herz gewachsen ist)
Hier mal die Errors :
Code:
Compiler: Default GCC compiler
Building Makefile: "C:\Dokumente und Einstellungen\Benutzername\Desktop\Neuer Ordner\Makefile.win"
Finding dependencies for file: C:\Dokumente und Einstellungen\Benutzername\Desktop\Neuer Ordner\main.cpp
Führt make... aus
make.exe -f "C:\Dokumente und Einstellungen\Benutzername\Desktop\Neuer Ordner\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Programme/Dev-Cpp/lib/gcc/mingw32/3.4.5/include" -I"C:/Programme/Dev-Cpp/include/c++/3.4.5/backward" -I"C:/Programme/Dev-Cpp/include/c++/3.4.5/mingw32" -I"C:/Programme/Dev-Cpp/include/c++/3.4.5" -I"C:/Programme/Dev-Cpp/include" -I"C:/Programme/Dev-Cpp/" -I"C:/Programme/Dev-Cpp/include/common/wx/msw" -I"C:/Programme/Dev-Cpp/include/common/wx/generic" -I"C:/Programme/Dev-Cpp/include/common/wx/html" -I"C:/Programme/Dev-Cpp/include/common/wx/protocol" -I"C:/Programme/Dev-Cpp/include/common/wx/xml" -I"C:/Programme/Dev-Cpp/include/common/wx/xrc" -I"C:/Programme/Dev-Cpp/include/common/wx" -I"C:/Programme/Dev-Cpp/include/common" -I"C:/Dev-Cpp/include"
In file included from C:/Dev-Cpp/include/boost/thread/future.hpp:12,
from C:/Dev-Cpp/include/boost/thread.hpp:24,
from main.cpp:1:
C:/Dev-Cpp/include/boost/exception_ptr.hpp:43: error: looser throw specifier for `virtual boost::exception_ptr::~exception_ptr()'
C:/Dev-Cpp/include/boost/exception/detail/exception_ptr_base.hpp:27: error: overriding `virtual boost::exception_detail::exception_ptr_base::~exception_ptr_base() throw ()'
make.exe: *** [main.o] Error 1
Ausführung beendet
}
und der dazugehörige Code (Ist ein beispiel COde , also sollte er funktionieren)
Code:
#include <boost/thread.hpp>
#include <iostream>
void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
void thread()
{
for (int i = 0; i < 5; ++i)
{
wait(1);
std::cout << i << std::endl;
}
}
int main()
{
boost::thread t(thread);
t.join();
}
Die Verzeichnisse sind ganz sicher richtig gesetzt und es sind auch ganz sicher alle Datein vorhanden . Habe auch schon Neuinstallation von wxDev-C++ gemacht und es kamen die selben Errors , ich hoffe mir kann jemand helfen oder eine Alternative zu dieser Klasse geben ...
Du musst einfach eine Referenz des Objektes an die Threadfunction übergeben, und daraus dann zurückcasten.
Es geht allerdings nicht, direkt in der Klasse eine Methode an den Thread zu übergeben (zumindest nicht mit CreateThread, sondern nur mit externen Klassen), sondern du müsstest eine Globale Funktion haben, und diese dann wie oben aus der Klasse heraus benutzen.
Aber erklär doch mal genauer was du machen willst, vllt. kann man es anders lösen.
Du musst einfach eine Referenz des Objektes an die Threadfunction übergeben, und daraus dann zurückcasten.
Es geht allerdings nicht, direkt in der Klasse eine Methode an den Thread zu übergeben (zumindest nicht mit CreateThread, sondern nur mit externen Klassen), sondern du müsstest eine Globale Funktion haben, und diese dann wie oben aus der Klasse heraus benutzen.
Aber erklär doch mal genauer was du machen willst, vllt. kann man es anders lösen.
Danke für deine Antwort .
Ich wollte eine Art Syntax Highlighting machen ...
Ich habe jetzt mal ein bisschen mit deinem Code rumprobiert , aber habe nicht wirklich eine Lösung gefunden ...
Bei mir ist das etwas komplizierter , als du es dargestellt hast ... Ich kopier mal das wichtigste ...
void AutoITEditDlg::CreateGUIControls()
{
//Hier wird natürlich noch mehr gemacht , aber das brauchst du denke ich //mal nicht ...
WxRichTextCtrl1 = new wxRichTextCtrl(this, ID_WXRICHTEXTCTRL1, wxT(""), wxPoint(0, 0), wxSize(797, 405), wxTAB_TRAVERSAL | wxWANTS_CHARS | wxVSCROLL | wxHSCROLL | wxNO_BORDER | wxRE_MULTILINE, wxDefaultValidator, wxT("WxRichTextCtrl1"));
Das funktioniert auf jedenfall, so steht es in einem meiner Programme.
Und zeig mir mal den Code der bei dir mit //... auskommentiert ist, denn da ist grade der Knackpunkt mit dem zurückcasten. Halte dich einfach an mein Beispiel. BMW ist da übrigens der Klassenname, was im nachhinein ein wenig verwirrend sein kann.
void AutoITEditDlg::CreateGUIControls() { //Do not add custom code between //GUI Items Creation Start and GUI Items Creation End. //wxDev-C++ designer will remove them. //Add the custom code before or after the blocks ////GUI Items Creation Start
WxTimer1 = new wxTimer(); WxTimer1->SetOwner(this, ID_WXTIMER1);
Es funktioniert auch soweit , dass ich den Thread erstellen kann und er wird auch gestartet , aber sobald die erste Funktion kommt , für die das Objekt gebraucht wird , beendet sich das Programm ohne irgendwelche Errors oder ähnliches zu hinterlassen .
Edit :
Das ist nicht der komplette Code , aber wenn ich den kompletten Code poste , würde das in Unübersichtlichkeit enden und in Funktionen , die dir nicht bekannt sind
(auser du benutzt wxDevC++).
void AutoITEditDlg::CreateGUIControls()
{
//Do not add custom code between
//GUI Items Creation Start and GUI Items Creation End.
//wxDev-C++ designer will remove them.
//Add the custom code before or after the blocks
////GUI Items Creation Start
WxTimer1 = new wxTimer();
WxTimer1->SetOwner(this, ID_WXTIMER1);
Es funktioniert auch soweit , dass ich den Thread erstellen kann und er wird auch gestartet , aber sobald die erste Funktion kommt , für die das Objekt gebraucht wird , beendet sich das Programm ohne irgendwelche Errors oder ähnliches zu hinterlassen .
Edit :
Das ist nicht der komplette Code , aber wenn ich den kompletten Code poste , würde das in Unübersichtlichkeit enden und in Funktionen , die dir nicht bekannt sind
(auser du benutzt wxDevC++).
Dann wird der Thread wohl nicht richtig gestartet. Überprüf einfach mal ob das handle (thread) gültig ist, und falls nicht, lass dir mit den Fehlercode ausgeben.
Ich habe den Thread zwar nun nur kurz überflogen aber was ich noch gerne bemerken würde zu deinem Test-Programm (.. main() { CreateThread(...); return;})
wenn du den Thread in diesem Programm erzeugst, endet das Programm bevor der Thread möglicherweise ausgeführt wurde. Der Thread ist Teil deines Prozesses und der Prozess endet nach main(). Ein WaitForSingleObject(handle) sollte es da tun.
Ich habe den Thread zwar nun nur kurz überflogen aber was ich noch gerne bemerken würde zu deinem Test-Programm (.. main() { CreateThread(...); return;})
wenn du den Thread in diesem Programm erzeugst, endet das Programm bevor der Thread möglicherweise ausgeführt wurde. Der Thread ist Teil deines Prozesses und der Prozess endet nach main(). Ein WaitForSingleObject(handle) sollte es da tun.
Ok danke für die Antwort , aber das war mir klar , Ich wollte den Code nur sehr kurz halten
RoM Klassen 05/07/2009 - General Gaming Discussion - 8 Replies RoM Klassen:
0 Gamemaster
1 Krieger
2 Kundschafter
3 Schurke
4 Magier
5 Priester
6 Ritter
7 Runentänzer
Klassen 03/08/2009 - General Gaming Discussion - 7 Replies Hi,
ich wollte mal fragen, was ich werden kann bzw welch eKlasse ich mich spezialisieren sollte für miene Anforderungen
also ich habe ienen prieset / mage
22/17
kein bock, weil ich kein damage mache zwar gut GOT aber das dauert
dann nen warrior lvl 21
ist jut geil, weil ich viel damage mache
aber ich weiß nicht, was ich 2nd nehmen soll
bin am überlegen , ob ich nun mage / priest mach