Zum Inhalt springen

Absturz mit CDaoRecordSet


Filou

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...