1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
3
3
ZUGRIFFE
623
623
EMPFEHLEN
-
Hi,
Ich moechte gerne eine std::vector an meinen erzeugten "Working Thread" weitergeben. Wie wandle ich den std::vector in LPVOID um?
Kann man es wirklich nicht casten? Der std::vector wird in einer Klasse CFileList erzeugt. In der Dialogklasse arbeite ich alle, zuvor initialisierten, Vektorelemente (Dateien) ab und es funktioniert ohne Probleme.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
oid CImg2Dlg::OnBnClickedROI() { SetTimer(1,400,NULL); m_StartTime=CTime::GetCurrentTime(); int width,height; if(m_Format.GetCurSel()==F512) { width=height=512; } else{ width=648; height=572; } std::vector<ImgElement>::iterator listIte; char* data=new char[width*height]; int count=0; for(listIte=m_fList.ImgList.begin();listIte!=m_fList.ImgList.end();++listIte) { m_gpData.LoadFile((*listIte).name); if(!m_ROI.FindROI(width,height))(*listIte).blink=true; data=0; delete[] data; } m_StopTime=CTime::GetCurrentTime(); m_ElapsedTime=m_StopTime-m_StartTime; SetDlgItemInt(IDC_MIN,m_ElapsedTime.GetMinutes(),FALSE); SetDlgItemInt(IDC_SEC,m_ElapsedTime.GetSeconds(),FALSE); KillTimer(1); }
Nun passiert in dieser for-Schleife eine ganze Menge Bildverarbeitung mit hohem Zeitanspruch. Moechte fuer den Benutzer den Dialog freigeben und auch die Darstellung waehrend der Bildverarbeitungsroutine aendern.
Portiere ich die Bildverarbeitung in eine von CWinThread abgeleiteten Klasse, ist das zuvor geladene Vektorobjekt leer.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
BOOL CCompute::InitInstance() { std::vector<ImgElement>::iterator listIte; int szco=0; for(listIte=m_fList.ImgList.begin();listIte!=m_fList.ImgList.end();++listIte) { m_Processor.LoadFile((*listIte).name,width,height); m_Processor.DoFFT(width,height); m_Processor.Filter(width,height); m_Processor.Threshold(width,height); m_Processor.MorphOperation(width,height); } return TRUE; }
Warum ist meine Liste hier leer? Und wie kann ich an an InitInstance() Parameter uebergeben? Wenn ich ein CCompute Objeket in einer anderen Klasse erzeuge? Es kommt die Fehlermeldung: error C2248: 'CCompute::CCompute' : cannot access protected member declared in class 'CCompute' bei diesem Versuch.
Fuer Kritik, Beispielcodes, Literaturhinweis, Ratschlaege waehre ich sehr dankbar!
Gruss Rainer
-
21.10.09 10:42 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Hi.
Du mußt natürlich sicherstellen, das der Vektor nicht gleichzeitig von mehreren Threads bearbeitet wird.Code cpp:1
static_cast<void*>(&a_std_vector);
Warum löscht du data innerhalb der Schleife? Warum machst du das bei jedem Durchlauf? Wenn der Vektor leer ist wird der Speicher nicht freigegeben.
Ohne den Code zu sehen, kann man da nicht viel sagen.
Gruß
PS: Warum kreierst du denn eigentlich einen User Interface Thread? Eigentlich möchtest du doch einen Worker Thread, oder? http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspxGeändert von deepthroat (21.10.09 um 10:45 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Vielen Dank fuer die Hinweise. Hab es jetzt heraus bekommen. This Pointer sei Dank! Mit dem Pointer habe ich Zugriff auf alle Memberfunktionen und -variablen meiner Dialogklasse.
Starten des Threads aus einem meiner Eventhandler in der Dialogklasse:
wobei WorkingThread so in der Headerdatei meiner Dialogklasse deklariert werden muss.:Code :1
AfxBeginThread(WorkingThread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
Und so sieht dann der zugehoehrige Body aus:Code :1 2 3 4 5
class CProImg2Dlg : public CDialog { // Construction public: static UINT WorkingThread(LPVOID Param);Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
UINT CProImg2Dlg::WorkingThread(LPVOID CDlgObj) { CProImg2Dlg *this_dlg=(CProImg2Dlg*)CDlgObj; std::vector<ImgElement>::iterator listIte; int width=this_dlg->width; int height=this_dlg->height; for(listIte=(this_dlg->m_fList.ImgList.begin());listIte!=this_dlg->m_fList.ImgList.end();++listIte) { if(this_dlg->m_ROI.FindROI((*listIte).name,width,height)) { (*listIte).blink=false; //ROI detected -> no eye blink } } this_dlg->KillTimer(1); return TRUE;
Soviel zu dieser Huerde. Naechste Sache ist, wie komme ich von aussen an die bereits verarbeiteten Vectorelemente heran? Ich darf ja nicht in den Thread eingreifen. Wie kann ich den Thread von aussen stoppen?
Weil ich relativ neu in so ziemlich Allem bin, noch keine Ahnung habe und beide Varianten betrachten moechte. Von der Strucktur gefaellt mir die UI Thread Geschichte besser, weil sie in einer extra Klasse erzeugt werden muss.PS: Warum kreierst du denn eigentlich einen User Interface Thread? Eigentlich möchtest du doch einen Worker Thread, oder? http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx
Ich will lernen, also immer her mit Meinungen und Ratschlaegen!
Gruss RainerGeändert von rainer82 (22.10.09 um 03:12 Uhr)
-
Ich habe jetzt meine Threadroutine in einer neuen Klasse abgelegt. Nun moechte ich das resultierende Bild auf dem Picturecontrol meines Hauptdialoges darstellen. Wie greife ich, aus meinem Thread, auf Funktionen wie z.B. OnPaint() zu? Kann ich mir ein HANDLE aus dem Hauptdialog holen mit GetParent()? Wenn das geht, wie und ist das eine elegante, unanfaellige Loesung? Habe bisher keine passenden Referenzen gefunden.
GrussGeändert von rainer82 (22.10.09 um 10:19 Uhr)
Ähnliche Themen
-
[c++]Multithreading
Von kickerxy123 im Forum C/C++Antworten: 5Letzter Beitrag: 08.08.08, 11:05 -
Multithreading
Von Paranoia im Forum .NET Web und KommunikationAntworten: 1Letzter Beitrag: 24.06.08, 17:32 -
C# Multithreading
Von Hawkings im Forum .NET Windows FormsAntworten: 4Letzter Beitrag: 14.02.08, 15:05 -
Multithreading
Von Kaladial im Forum JavaAntworten: 10Letzter Beitrag: 20.09.07, 13:40 -
[c++] multithreading
Von cyrrus im Forum C/C++Antworten: 6Letzter Beitrag: 01.11.02, 20:08





Zitieren

Login






