(char*) geht mal und mal nicht



  • Hi,

    Ich hab da ein Problem bei dem ich nicht weiter weiß und deshalb für jeden Tipp dankbar bin! Also mein Problem ist folgendes:

    Ich habe ein vorgegebenes Programm erweitert. D.H ich habe statt eine 10 Stelligen Nummer nun ein 30 stellige Nummer. Das war ja soweit einfach und funktioniert auch ! mein Problem ensteht dann in Folgenenden Thread :

    UINT ScanThreadProc(LPVOID pParam)
    {
    	TRACE("start scanning\n");
      	g_ThreadFinished.ResetEvent();
    	bool fileexist = false;
    	CFile file;
    	char* ReceivePfad;	
    
    	ReceivePfad = (char*) pParam;
    
    	CString string;
             string.Format("%s",ReceivePfad);
    
             ...
    

    hier wird ein Pfad übergeben welcher vor dem Aufruf noch richtig ist. Nun passiert folgendes: da die Funktion mehrmals aufgerufen wird funktioniert die ReceivePfad = (char) pParam;* konvertierung beim erstenmal richitg und im string steht der richtige Pfad. Beim zweiten Aufruf wird dann aus dem Pfad (der vor dem Threadaufruf richtig ist) nur noch ein "P". Nun weiß ich nicht weiter. Ich schätze mal das des irgendwas mit der Speicherverwaltung zu tun hat da ich ja nichts geändert habe ausser dass ich aus einer 10 eine 30 stellige Nummer gemacht habe. Habe auch mal die Resourcendatei angeschaut. Kann es sein das ich den dort stehenden Ausdruck:

    #define IDC_EDIT_EINGABE                1000
    

    ändern muss? bedeutet die 1000 vielleicht der reservierte Speicherbereich? Ich kenn mich da halt nicht so gut aus und wollte lieber mal nachfargen bevor ich was schredder.

    P.S. IDC_EDIT_EINGABE wird s im Porg bei der geänderten Nummer verwendet

    Für euere Hilfe wäre ich sehr dankbar



  • Kannst verraten, wie der Pfad denn lauten sollte? Ist das 'P' der richtige Anfangsbuchstabe?

    Zur Resourcendatei: Diese Zeile definiert bloß den Bezeichner IDC_EDIT_EINGABE als den Wert 1000 zu.
    Hat nichts mit Speicher zu tun.



  • Zeig doch mal, wie du den Thread startest.



  • @PAul_C: Leider fängt der Pfad mit "C:\" an. Und ein "P" kommt auch nicht in dem Pfad vor!
    Wegen der Resdatei danke das wusste ich noch nicht.

    @MFK:

    er wird mit

    AfxBeginThread(ScanThreadProc,l_cLogoutPfadReceive);

    wobei l_cLogoutPfadReceive vom Typ char l_cLogoutPfadReceive[256] ist und vor dem Aufruf mit folgenden Befehl erstellt wird :

    strcpy(l_cLogoutPfadReceive,m_CReceiveFile);

    Danke für euere interesse ich wüsste sonst nicht was ich probieren sollte.



  • Robert.sc schrieb:

    wobei l_cLogoutPfadReceive vom Typ char l_cLogoutPfadReceive[256] ist und vor dem Aufruf mit folgenden Befehl erstellt wird :

    Und was passiert nach dem Aufruf? Ist l_cLogoutPfadReceive möglicherweise eine lokale Variable? Hast du sichergestellt, dass l_cLogoutPfadReceive überhaupt noch existiert, wenn du den Parameter im Thread auswertest?



  • mhhh das wär eine Idee! Ich habe bis jetzt immer vor und nachdem Aufruf geschaut ob der Pfad noch drinn steht! Und das war der Fall, aber des beweißt ja nicht dass der Pfad wärend dem Thread noch aktuell ist. habe unten nochmal den Code rund um den Aufruf gepostet. writelog ist ne Funtkion die den Parameter in eine .log Datei schreibt.

    char l_cPHPPfadReceive[256];
                strcpy(l_cPHPPfadReceive,m_CReceiveFile);
                DeleteFile((LPCTSTR)l_cPHPPfadReceive);
    
                writelog(l_cPHPPfadReceive);
    	   AfxBeginThread(ScanThreadProc,l_cPHPPfadReceive);
                writelog(l_cPHPPfadReceive);
    
                g_eventStart.SetEvent();
    	   g_eventKill.ResetEvent();
    
       }; //end of if
    
       int laenge=m_CEingabe.GetLength();
       CEdit* E_p = (CEdit*) GetDlgItem (IDC_EDIT_EINGABE) ;
       E_p->SetFocus () ;
       E_p->SetSel (0 , laenge) ; 
    
    	UpdateData(FALSE);
    }
    

    Das mekwürdige : wenn ich ein 10 stellige Nummer nehme bringt er ab und zu auch den Fehler.

    Muss ich irgendwo eine Pause einbauen damit sichergestellt ist dass l_cPHPPfadReceive noch existiert??



  • Robert.sc schrieb:

    Das mekwürdige : wenn ich ein 10 stellige Nummer nehme bringt er ab und zu auch den Fehler.

    Das ist das Schöne an undefiniertem Verhalten: Wenn es mal klappt, kannst du daraus nicht folgern, dass du es richtig gemacht hast.

    Muss ich irgendwo eine Pause einbauen damit sichergestellt ist dass l_cPHPPfadReceive noch existiert??

    Du könntest ein Event benutzen. Du könntest auch l_cPHPPfadReceive mit new anlegen, und nach dem Auswerten/Kopieren im Thread wieder löschen.



  • Hast du sichergestellt, dass l_cLogoutPfadReceive überhaupt noch existiert, wenn du den Parameter im Thread auswertest?

    Alos du hattest damit natürlich recht!! Die lokale Variable war garnicht mehr verfügbar als der Thread sie auswerten wollte! Da die Anwendung sowieso nicht mehr lange im Gebrauch ist habe ich die Variable einfach global deklariert und schon läuft sie einwandfrei. Das ist zwar nicht die sauberste Lösung aber sie funkitioniert und das ist ja das wichtigste! Danke nochmal für die Tipps!! Die haben mir sehr viel Zeit und Nerven gespart!

    Schöne Woche noch

    Mfg Robert


Anmelden zum Antworten