Zum Inhalt springen

BAR

Mitglieder
  • Gesamte Inhalte

    2
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von BAR

  1. Hi dieterds, Ich bearbeite Files. Und mithilfe der Klasse CRecFileFind kann ich in einer for-Schleife File für File "holen" und dieses dann einer Klasse weitergeben und weiterverarbeiten. Aus diesem Grund sollte ich den Thread jedes Mal neu aufrufen, das aktuelle File durchscannen lassen und dann wieder schliessen. Das ist aber nicht die Problematik. Es geht eher darum, dass ich in der Methode die ich aufrufe danach keinen Zugriff auf Membervariablen habe. Sobald er entweder auf eine Zeile trifft wo ich etwas in ein Control schreiben will oder wenn er auf eine normale Funktion die ich aufrufen will trifft springt er einfach wieder zur ersten Zeile des Threads zurück. Beispiel: Ich habe folgende Funktionen (alle in der selben Klasse): - OnButtonIrgenwas() - ProcessFile() - GetDatabaseInformation() - GetRouteInformation() So, dann will ich aus dem OnButtonIrgendwas() die Funktion ProcessFile() in einem neuen Thread aufrufen. In DIESER Funktion (ProcessFile) benutze ich aber noch andere Funktionen damit mein Vorgang durchgeführt werden kann. Und zwar GetDatabaseInformation() und GetRouteInformation. Nun, das weiterleiten von OnButtonIrgendwas() zu ProcessFile() in einem neuen Thread funktioniert. Sobald ich jedoch im neuen Thread eine der zwei "Hilfsmethoden" aufrufen will springt er mir sofort zu der ersten Zeile von ProcessFile() zurück. Und auch wenn ich eine Editbox (egal ob sie Control, String oder was auch immer ist) beschreiben will, springt er auch sofort zu der ersten Zeile von ProcessFile() zurück. Ist das soweit verständlich oder hab ich etwas komisch erklärt? Umgehen kann ich das alles nicht. Die Hilfsmethoden brauche ich umbedingt, beschreiben muss ich die Membervariablen meines Dialoges ebenfalls. Der Prozess kann halt einige Minuten dauern und wenn einfach nichts geschieht denkt der User das Programm sei abgekratzt, also muss ich ihm zeigen welche Files momentan bearbeitet werden etc. Danke für die Aufmerksamkeit
  2. Hallo allerseits, Gestern habe ich den ganzen Tag damit verbracht mein schon fertiges Programm mit Multithreading zum laufen zu bringen weil ich einen Button einfügen wollte der zum abbrechen des Prozesses dient. Ich habe es immernoch nicht geschafft und bin nahe der Erschöpfung Bei dem Henkesoft Tutorial wurde es so gemacht: void CThread001Dlg::OnButtonStart() { m_Flag = 1; CWinThread* pThread = AfxBeginThread (thrFunction, this); } void CThread001Dlg::OnButtonStop() { m_Flag = 0; } UINT CThread001Dlg::thrFunction(LPVOID pParam) { CThread001Dlg* pDlg = (CThread001Dlg*) pParam; pDlg->thrRun(); return 0; } void CThread001Dlg::thrRun() { while (m_Flag) { Sleep(1000); MessageBeep(0); } } Wie man unschwer erkennen kann ruft er in der Thread-Funktion eine ganz normale Funktion der Klasse aus dem Dialog auf. Ich wollte es ähnlich machen: void CRouteSortDlg::OnButtonReplacing() { UpdateData(TRUE); ... CAddFunctions AF; CRecFileFind RFF(m_strEditDirectoryLocation, ".pt"); int nF = 0; int FC = RFF.GetFileCount(); BOOL checkFile; CString currentFile; CString output; GetDlgItem(IDC_BUTTON_CANCEL)->EnableWindow(TRUE); CreateNewDataSource(); for(nF = 0; nF < FC; nF++) { ... else //IF THE CURRENT FILE IS NOT DAMAGED { m_Flag = 1; CWinThread* pThread = AfxBeginThread(ProcessSeparatingThread, this); } } UpdateData(FALSE); } /**************************************************************************************************************************/ /**************************************************************************************************************************/ UINT CRouteSortDlg::ProcessSeparatingThread(LPVOID pParam) { CRouteSortDlg* pDlg = (CRouteSortDlg*) pParam; while(pDlg->m_Flag == 1) { pDlg->ProcessSeparating(); } return 0; } /**************************************************************************************************************************/ /**************************************************************************************************************************/ void CRouteSortDlg::ProcessSeparating() { UpdateData(TRUE); while(m_Flag == 1) { ... //Verdammt lange Funktion. Wenn ich die posten würde würde sich das vermutlich niemand anschauen und sie ist nicht von Belang } UpdateData(FALSE); }Könnte mir jetzt vielleicht jemand sagen warum ich wenn ich den Button drücke die folgenden Fehler bekomme? Da muss ich etwa 15 Mal auf OK klicken damit es verschwindet Ein "normaler" Debug Assertion Fehler An den Funktionen selber liegt es nicht denn die funktionieren ohne Multithreading tadellos, ich muss nur noch das obige hier zum laufen kriegen Vielen Dank im Voraus

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...