Filou Geschrieben 11. April 2006 Teilen Geschrieben 11. April 2006 Hallo an Alle!! (Hi Klotzkopp) Ich habe ein Problem mit der CDaoRecordSet. Also ich hab ein Hauptdialog da wird meine Datenbank geöffnet und gelesen. Dann habe ich ein zweiten Dialog welcher modal vom Hauptdialog geöffnet wird. In diesem zweiten Dialog wird in die Datenbank geschireben. Da klappt das auch ohne Probleme. Jetzt habe ich noch einen weiteren Dialog gemacht in dem auch etwas in die selbe Datenbank und Tabelle geschrieben werden soll. Dieser wird auch modal geöffnet. Aber da stürzt mein Programm ab. Ich öffe die Tabelle wie in den anderen Dialogen mit m_Datenbank.Open(dbOpenDynaset, "SELECT * FROM Tabelle", 0); Ich habe auch schon die Datenbank mit Close() im Hautdialog geschlossen, bevor ich sie im nächsten Dialog öffnen möchte. Aber macht keinen unterschied. Hier die Fehlermeldung: Unbehandelte Ausnahme in Programm.exe (DAO0350.DLL): 0xC00000005: Access Violation Disassemblierung: 044C65D3 cmp dword ptr [eax+38h],0 Aufrufliste: DAO350! 044c65d3() DAO350! 044d08fb() 24448b00() Woran könnte das denn liegen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Filou Geschrieben 11. April 2006 Autor Teilen Geschrieben 11. April 2006 Wenn ich die Geschichte mit Close und wieder Open Rausnehme, dann stürzt es bei dem Befehl AddNew(); bei folgender Stelle ab: void CDaoRecordset::AddNew() { ASSERT_VALID(this); [B][COLOR="Red"]->[/COLOR][/B] ASSERT(IsOpen()); ASSERT(m_pDAORecordset != NULL); Sagt Euch das etwas? ich glaube das ist mein eigentliches Problem. ich muss die Datenbank ja nicht schließen um sie wieder zu öffnen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Filou Geschrieben 12. April 2006 Autor Teilen Geschrieben 12. April 2006 weiß jetzt wieso es abszürzt. Weil auf die Datenbank in einem Thread zugegriffen wird. Aber das geht nicht anders. Es sei denn der Thread würde eine Variable auf TRUE oder FALSE setzten und die würde ich auserhalb des Threads abfragen. Nur bräuchte ich dann sowas wie eine Wait Funktion. Also dass so lange gewartet wird bis die Variable TRUE ist. Nur dürften wärend des Wartens die Steuerelemente des Dialogs nicht blockiert sein. Gibt es so eine Funktion? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 12. April 2006 Teilen Geschrieben 12. April 2006 Hm....WaitForSingleObject? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Filou Geschrieben 12. April 2006 Autor Teilen Geschrieben 12. April 2006 Hm....WaitForSingleObject? Hab ich auch schon gefunden... Wartet das bis z.b bCheck == TRUE? Das will doch als Parameter ein Object* obj?? Und blockiert mir das dann beim warten alle anderen Steuerelemente in dem Dialog? Also der benutzer soll noch auf Abbrechen klicken können.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 12. April 2006 Teilen Geschrieben 12. April 2006 Ich habe ehrlich gesagt nicht den gerinsten Plan was du machen möchtest. Es gibt auch nicht die Lösung für Probleme. Es gibt immer mehrere und welche du nun haben möchtest weiß ich nicht. Ich nehme aber mal an, du möchtest den Thread einem Dialog sagen lassen ob er was machen darf oder nicht. Wenn ja, so übergib doch dem Thread einen Zeiger auf den Dialog und verpasse dem Dialog eine Membervariable + Zugriffsfunktionen die ihm signalisieren ob er was machen darf oder nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Filou Geschrieben 12. April 2006 Autor Teilen Geschrieben 12. April 2006 Aslo ich versuchs zu erklären. Der Thread soll alle 3 Sekunden prüfen ob in einem Temp Verzeichnis eine Datei liegt. Irgendeine. Das muss der therad machen damit der Dialog noch steuerbar bleibt. Das funktioniert auch schon. Dann soll der Thread den Dateinamen in die Datenbank speichern. Wie übergebe ich denn dem Thread einen Zeiger von meinem Dialog? Ich glaube das hab ich schon.. bin nicht sicher. Also so rufe ich den Thread auf: CWinThread *pThread = AfxBeginThread(MyMFCThread, this, THREAD_PRIORITY_NORMAL); Und das ist der Thread: UINT MyMFCThread(void* pParam) { CTestDlg *pWnd; pWnd=(CTestDlg*)pParam; pWnd->DateiSuchen(); return (1); } Und ich kann auch in dem Thread über auf die Membervariable zugreifen this->m_DBDatenbank.AddNew(); Nur abstürzen tuts halt wenn ich das tue... Wie meinst DU das mit dem Zeiger? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 12. April 2006 Teilen Geschrieben 12. April 2006 1. Hab ich mal gelernt, daß Threads keine "Oberfläche" haben sollten. 2. Wieso rufst du in dem Thread eine Memeberfunktion des Dialoges auf, welche scheinbar die Dateisuchen soll? Entweder du suchst in dem Thread die Datei und gibst die Ergebnisse an den Dialog, oder du machst das gleich im Dialog mit Hilfe von Timern. 3. Der Thread ist nicht dein Dialog! Wenn dann schon per pWnd->m_DBDatenbank.AddNew(); Vermute ich mal... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Filou Geschrieben 12. April 2006 Autor Teilen Geschrieben 12. April 2006 Die Funktion DateiSuchen war zwar in der Klasse des Dialogs aber hat mit dem Dialog nix gemacht, sondern nur die Ergebnisse in eine Variable gespeichert. Aber ich habe es jetzt geändert. Jetzt passiert alles in dem Thread. Trotzdem türzt dieser bei pWnd->m_DBDokumente.AddNew(); ab und zwar genau bei ASSERT(IsOpen()); in der Funktion AddNew(); In einem anderen Forum habe ich gelesen dass man DAO nicht aus einem thread heraus benutzen kann. Ich muss es also doch so machen dass im Dialog gewartet wird bis der Thread beendet ist, also bis die Datei gefunden wurde. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.