hangen geblieben.....

hi leute.. also ich hab da jet ein prog geschrieben was binär eine datei zieht. und anja klappt auch wunderbar.. nur der bleibt weren der dateiübertragung hängen und naja zieht wenn der fertig ist geht das prog immer.. naja aber das ist nciht gut.. wie kann man das ändern??

ich glaube nicht das c++ so lahm ist oder mein prozessor (AMD XP2400+)
ich dneke es ist eher was mit dem code also vielleiht muss ich irrgendwie was einbringen was die anwendung aktualisiert oder so..

naja bin für alle tips offen..
 
Ohne den Code zu sehen ist das recht schwierig, aber ich denke mal du musst das wohl mit threads lösen. Wenn deine Klasse (ich denke mal du nimmst noch die von der ich hier in nem anderen Thread gelesen hab), bzw. dein Objekt solange nicht reagiert wie es überträgt, müsstest du es das im Hintergrund erledigen lassen.
 
also hier der code womit es gezogen wird..

[EDIT::]
hab jetzt das mit den threads nachgeschaut und was gefunden soweit so gut ist auch nciht besonders schwer nur das prob jetzt .. wenn ich meine eigene function
mit den threads öffnen versuche sagt der mir immer das der nciht auf die klasse zugreifen kann also wenn ich das hier zb ausführe..:

list1.GetItemText(nSelected,0)

list1 => ist bei mir eine List Control und naja so wie es aussieht kann ich aus der methode aus nocht auf dei Controlls auf dem MFC dialog zugreifen :(

woran könnte das liegen?? funktioan falsch deklariert oder was??

danke schon mal..
mfg
andy18
 
Jaja, diesen Fehler hatte ich auch schon oft....

Das Problem ist, dass der 2. Thread eigentlich nichts, vom ersten "weiß". Also, wie sollte er dann auch den ListBox zugreifen können, wenn er nichts von dessen existenz weiß --> Error. Lösung: du kannst ihm ja einen void* an den Thread als Parameter übergeben (2. Aufrufsparameter), und so ihm einen Pointer auf den Dlg geben.

Ist eigentlich watchen einfach zu lösen, aber bis man da draufkommt, das dauert eine weile (zumindest bei mir :D)...

Also hier mal ein Codeausschnitt:

!!!Vorsicht diese Beispiele sind mit KEINEM Thread-syncronisator ausgerüstet und so nicht für multithreads sicher (Sprich kein MuteEx etc, kontrolliert den Zugriff auf die Objecte)!!!


Code:
UINT Thread(void *param)
{
    Class *alpha=(Class*)param;   // Typecasten wir unseren void* in die gewollte Class* und alle sind glücklich und zufrieden :D

   alpha->DoSmth();   //ganz so aufrufen, als wäre es ein Pointer (weil es ja auch einer ist ;))
}

function main()
{
     Class xyz;    // die FTP-Klasse, z.B., kann aber auch alles andere sein
     AfxBeginThread(thread,(void*)&xyz); // übergeben wir eine Pointer auf unsere Klasse an den 2. Thread

}

oder wenn du mehrer Klassen übergeben willst (oder mehrere Variablen), so musst du einen "Container erschaffen, diesen ausfüllen und dan dem Thread übergeben:

Code:
class container()
{
public:
    int nmr;
    std::string haha;
    CString aha!
   Class *xyz_p;    //da wir eine andere Klasse drin haben, ist es schön, einen destructor zu schreiben, damit diese dann auch vernichtet wird

private:
   ~container()
   {}
}

UINT thread(void *p)
{
     container *con=(container*)p;
     con->nmr++;
     ...
}

function main()
{
    Class xyz;

    container con;
    con.nmr=1;
    con.haha="hallo";
    con.aha="du;
    con.xyz_p=xyz;

   AfxBeginThread(thread,(void*)&con);
}

OK, also ich hoffe ich konnte weiterhelfen (und wie immer, "Keine Garantie auf die Funktionstüchtigkeit des Source"). Hoff konnte helfen

MfG
Mobius
 
Zurück
Oben