tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
623
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    rainer82 rainer82 ist offline Mitglied
    Registriert seit
    Aug 2009
    Beiträge
    13
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von rainer82 Beitrag anzeigen
    Ich moechte gerne eine std::vector an meinen erzeugten "Working Thread" weitergeben. Wie wandle ich den std::vector in LPVOID um?
    Code cpp:
    1
    
    static_cast<void*>(&a_std_vector);
    Du mußt natürlich sicherstellen, das der Vektor nicht gleichzeitig von mehreren Threads bearbeitet wird.
    Zitat Zitat von rainer82 Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        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;
            }
    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.
    Zitat Zitat von rainer82 Beitrag anzeigen
    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.
    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.aspx
    Geändert von deepthroat (21.10.09 um 10:45 Uhr)
    rainer82 bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    rainer82 rainer82 ist offline Mitglied
    Registriert seit
    Aug 2009
    Beiträge
    13
    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:
    Code :
    1
    
    AfxBeginThread(WorkingThread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
    wobei WorkingThread so in der Headerdatei meiner Dialogklasse deklariert werden muss.:
    Code :
    1
    2
    3
    4
    5
    
    class CProImg2Dlg : public CDialog
    {
    // Construction
    public:
        static UINT WorkingThread(LPVOID Param);
    Und so sieht dann der zugehoehrige Body aus:
    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?
    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
    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.
    Ich will lernen, also immer her mit Meinungen und Ratschlaegen!

    Gruss Rainer
    Geändert von rainer82 (22.10.09 um 03:12 Uhr)
     

  4. #4
    rainer82 rainer82 ist offline Mitglied
    Registriert seit
    Aug 2009
    Beiträge
    13
    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.

    Gruss
    Geändert von rainer82 (22.10.09 um 10:19 Uhr)
     

Ähnliche Themen

  1. [c++]Multithreading
    Von kickerxy123 im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 08.08.08, 11:05
  2. Multithreading
    Von Paranoia im Forum .NET Web und Kommunikation
    Antworten: 1
    Letzter Beitrag: 24.06.08, 17:32
  3. C# Multithreading
    Von Hawkings im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 14.02.08, 15:05
  4. Multithreading
    Von Kaladial im Forum Java
    Antworten: 10
    Letzter Beitrag: 20.09.07, 13:40
  5. [c++] multithreading
    Von cyrrus im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 01.11.02, 20:08