Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Inhalt von Clistctrl aktualisieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.01.2004, 16:29 Uhr
~Salvador12
Gast


Hallo alle zusammen

ich habe folgendes Problem: ich hab eine Liste die ich mit Daten fühle. Danach führe ich mit Hilfe von CreateProcess ein Script auf mit denn Daten aus der Liste als Parameter, praktisch nach jeder Zeile wird ein neues Prozess aufgerufen. Nach jedem beendetem Prozess würde ich gerne in die Liste z.B Fertig schreiben. Leider geht es nicht. Das Hauptdialogfeld friert praktisch ein und erst wenn alle Prozesse fertig sind wird die entsprechende Spalte gefühlt. Ich habe schon mit Sleep(..) ausprobiert was leider nicht ging. UpdateData habe ich natürlich auch drin. Für Hilfe wäre ich sehr dankbar.

Gruß Salfador
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.01.2004, 18:32 Uhr
Darky



dann speichere die daten zwischen und leere nach jedem prozess die listbox und zeichne sie neu !

so ähnlich!

C++:
int fertig, gesamt=100, c;

int datensatz[100]//welche datenform auch immer???

CString ausgabe;

for(c=0;c<gesamt;c++)
{
    ausgabe.Format("%d",datensatz[c]);
    m_clistbox.AddString(ausgabe);
}
UpdateData(FALSE);


//eigentlicher syntax
for(fertig=0;fertig<gesamt;fertig++)
{
    CreateProcess(..datensatz[fertig]..);//ich hoffe das dauert ne weile ansonsten rennt deine listbox nur so durch (müsstest du ne pause einfügen)

    m_clistbox.ResetContent();

    for(c=0;c<=fertig;c++)
    {
         ausgabe.Format("%d \t Fertig",datensatz[c]);//fertig
         m_clistbox.AddString(ausgabe);
    }
    for(c=fertig+1;c<gesamt;c++)
    {
         ausgabe.Format("%d",datensatz[c]);//nicht fertig
         m_clistbox.AddString(ausgabe);
    }
    UpdateData(False);
}
  


Dieser Post wurde am 27.01.2004 um 18:35 Uhr von Darky editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.01.2004, 12:36 Uhr
Darky



oh sorry du meinst CListCtrl und nicht CListBox hab ich mich verguckt!

bei CListCtrl müsste man schon etwas mehr über das project wissen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.01.2004, 18:33 Uhr
~Salvador12
Gast


Hallo

danke für deine Antwort, ich tu mal maine ganze funktion posten:


C++:
void CFindFilesDlg::OnConvert()
{    //AddInfo();
    UpdateData(TRUE);
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    TCHAR cPath[MAX_PATH];
    CString aktPhad=this->AktPfadFinden();
    CString Anfang ="cmd.exe /c cscript.exe "+aktPhad+"\\wmcmd.vbs -input ";
    CString Quele,a;
    CString Output;
    CString aut=" -output ";
    CString sPath;
    CString sPath1;
    int nOrdner,l,n;
    CString NameQ;
    CString Prov = " -loadprofile "+aktPhad+"\\Data\\";

    if(m_list.GetItemText(0,4)=="Bereit")
    {
        for(int i=0;i<m_list.GetItemCount();i++)
        {
            //m_in=i;
            //m_Flag = 1;
            //CWinThread* pThread = AfxBeginThread (thrFunction, this);
            m_Flag = 0;
            //UpdateData(false);
            //Sleep(200);
            //MessageBox("Hall");
            
            Output=m_list.GetItemText(i,1);            
            l=Output.GetLength();            
            n=0;
            nOrdner=0;
            while(nOrdner!=-1)
            {
                if(nOrdner!=l-1)
                    n=nOrdner;
                if(nOrdner!=l-1)
                    nOrdner=Output.Find("\\",n+1);
                if(nOrdner==l-1)
                    nOrdner=-1;
            }
                
            Output.Delete(n,l-n);
            Output+="\\Web\\";
            CreateDirectory(Output,NULL);
            
            for(int j=0;j<m_list2.GetItemCount();j++)
            {    
                
                NameQ=m_list.GetItemText(i,0);
                //MessageBox(NameQ);
                //int a=NameQ.GetLength();
                NameQ.Replace(NameQ.Right(4),m_list2.GetItemText(j,0));            
                Quele=m_list.GetItemText(i,1)+m_list.GetItemText(i,0);                
                NameQ.Replace(NameQ.Right(3),_T("wmv"));
                sPath=Anfang+Quele+aut+Output+NameQ+Prov+m_list2.GetItemText(j,0);
                strcpy(cPath, LPCSTR(sPath));

        //die Conbertierung wird über Comandlind mit dem skript wmcmd.vbs ausgeführt
                ZeroMemory( &si, sizeof(si) );
                si.cb = sizeof(si);
                ZeroMemory( &pi, sizeof(pi) );
                if ( !CreateProcess(0,cPath,
                    NULL,             // Process handle not inheritable.
                    NULL,             // Thread handle not inheritable.
                    FALSE,            // Set handle inheritance to FALSE.
                    0,                // No creation flags.
                    NULL,             // Use parent's environment block.
                    NULL,             // Use parent's starting directory.
                    &si,              // Pointer to STARTUPINFO structure.
                    &pi ))
                {
                    MessageBox("Konvertierung fehlgeschlagen","Error", MB_ICONERROR | MB_OK);
                }

    
                WaitForSingleObject( pi.hProcess, INFINITE );//I
    
                // Close process and thread handles.
                CloseHandle( pi.hProcess );
                CloseHandle( pi.hThread );
            }
            m_list.SetItemText(i,4,"Fertig");
            UpdateData(false);
        }
    }

    if(m_list.GetItemText(0,0)=="")
        MessageBox("Video Dateien fehlen");

    if(m_list2.GetItemText(0,0)=="")
        MessageBox("Provile Dateien fehlen");

}



Wie man sieht habe ich das ganze über ein tread probiert, wo ich dann über UdateData versucht habe das Fenster zu aktualisieren. Ging leider schief, das Programm stürzt dann ab. Danach habe ich Update Data mit dem befehl m_list.SetItemText(m_in,4,"In Bearbeitung") ersetzt. Funktioniert hat’s leider nicht, aber das Programm stützte wenigstens nicht ab. Für etwas Hilfe were ich dankbar.

gruß Salfador
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.02.2004, 14:16 Uhr
~global
Gast


hi, wäre noch interessant zu sehen was der thread macht...

C++:
...
                WaitForSingleObject( pi.hProcess, INFINITE );

                CloseHandle( pi.hProcess );
                CloseHandle( pi.hThread );
            }
            m_list.SetItemText(i,4,"Fertig");
            UpdateData(false);
...
//also ich würde das so ändern:

                WaitForSingleObject( pi.hProcess, INFINITE );
                m_list.SetItemText(i,4,"Fertig");
                CloseHandle( pi.hProcess );
                CloseHandle( pi.hThread );
            }

// kann man bei ClistCtrl weglassen, zumindest funktionierts bei mir ohne
//          UpdateData(false);

ansonsten fällt mir jetzt auf anhieb kein weiterer fehler auf (außer Profile mit "f" )

!gruß!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.02.2004, 17:04 Uhr
~Salvador12
Gast


Hi

also der Thread habe ich so verwirklicht


C++:
UINT CFindFilesDlg::thrFunction(LPVOID pParam)
{
       CFindFilesDlg* pDlg = (CFindFilesDlg*) pParam;
    pDlg->thrRun();
    return 0;
}

void CFindFilesDlg::thrRun()
{
    while (m_Flag)  
    {
        m_list.SetItemText(m_in,4,"In Bearbeitung");
    //UpdateData(false);
    }
}

Wie schon gesagt, updatedate stürzt das Programm ab
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.02.2004, 17:15 Uhr
~global
Gast


du bentzt den thread ja nur um "in bearbeitung" ins clistctrl zu schreiben, also kannst den auch weglassen wenn du das setitemtext vor den createprocess machst. wie gesagt, bei mir funktioniert die ausgabe in eine clistctrl auch ohne updadtedata.
wann genau stürzt das programm den ab, bis wohin läufts denn ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.02.2004, 18:18 Uhr
~global
Gast


so! war gerade auf dem klo, und da hat man bekanntlich die besten ideen !

iss ja klar das das nicht funzt, du machst zwar mit creatprocess einen neuen thread auf aber hälst den hauptthread ja mit waitforsingleobject an, dh. der hauptthread reagiert jetzt nicht mehr und kann auch die dialogfelder nicht aktualisieren...
am besten das creatprocess von einem anderen thread aufrufen

gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.02.2004, 00:31 Uhr
~Salvador12
Gast


Hallo

danke für denn tip. Habe jetz den CreateProzess in den tread reingelegt. Funktioniert auch so weit, man kann jetz in die Liste reinschreiben was man will wärend der Prozess leuft. Das einzigste Problemm ist, wie kann man denn Dialog sagen daß der Prozess fertig ist. Ich will ja immer wenn der Prozess fertig ist was in die Liste was reinschreiben.

Gruß Salfador
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.02.2004, 15:08 Uhr
~global
Gast


naja, lass doch den thread was in die liste schreiben... die ThreadFuncion könnte in etwa so aussehen:

C++:
{
CFindFilesDlg* pDlg = (CFindFilesDlg*) pParam;
pDlg->m_list.SetItemText(m_in,4,"In Bearbeitung");
if ( CreateProcess(...) == TRUE )
{
     WaitForSingleObject( pi.hProcess, INFINITE );
     pDlg->m_list.SetItemText(i,4,"Fertig");
     CloseHandle( pi.hProcess );
     CloseHandle( pi.hThread );
}
else
     MessageBox("Konvertierung fehlgeschlagen","Error", MB_ICONERROR | MB_OK);
}


--
gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: