Seite 1 von 1

[4.02] Bug mit OpenFileRequester() und Threads

Verfasst: 14.08.2007 15:46
von NicTheQuick
Ich weiß nicht, ob das in der neuen Beta funktioniert, aber ich poste
meinen Fehler trotzdem mal.

Bitte "Threadsicher EXE" in den Compiler-Optionen wählen!

Wenn man folgenden Code startet und beim zweiten Requester auf
"Öffnen" drückt, stürzt das Programm mit der Fehlermeldung "Invalid
Memory Access" ab. Beim ersten Requester ist es egal, ob man "Öffnen"
oder "Abbrechen" klickt. Das Programm stürzt nicht ab, wenn man beim
zweiten auf "Abbrechen" drückt. Hat man allerdings eine Datei ausgewählt
und klickt auf "Öffnen", geht es den Bach hinunter.

Code: Alles auswählen

Structure set
  File.s
EndStructure

Procedure Thread(*set.set)
  *set\File = OpenFileRequester("Wählen sie die Datei aus...", "\", "Alle Dateien (*.*)|*.*", 0)
EndProcedure

set1.set
set2.set

t1 = CreateThread(@Thread(), @set1)
t2 = CreateThread(@Thread(), @set2)

WaitThread(t1)
WaitThread(t2)

Debug set1\File
Debug set2\File
Ich bräuchte den Code funktionsfähig, weiß aber nicht, wie ich am besten
ran gehen. Notfalls muss ich mir den OpenFileRequester() eben selbst
programmieren.

Verfasst: 14.08.2007 16:01
von ts-soft
Wenn PB das Handle zum Hauptfenster übergibt (und das wird so sein, ist
normal) wirds im Thread nicht gehen, weil Ereignisse nur in dem Thread
ausgelöst werden sollten, wo das Hauptfenster erstellt wurde.

Ob Du per API mehr Erfolg hast, mit Handle 0 weiß ich nicht, aber ich glaube nicht.

Modale Dialoge sollten in Thread immer probleme machen

Verfasst: 14.08.2007 19:07
von NicTheQuick
Also nehmen diese ganzen Requester immer das Handle des letzten aktuellen
Fensters und "disablen" das?
Da hätte ich gerne einen Wunsch frei und wünsche mir einen optionalen
Parameter bei allen Requestern, mit dem ich das Parent-Window angeben
kann.

Falls das nicht hinhaut (und das ist wohl sehr wahrscheinlich), bliebe mir die
Möglichkeit über API, da mein Programm auf Linux nicht laufen wird.
Allerdings weiß ich nicht, mit welcher API ich diese Requester öffne...

Kann mir da jemand helfen? /:->
Dankeschön! :allright:

(Ich denke doch, dass im Bugs-Forum die Möglichkeit eines alternative Codes
gegeben werden kann. Falls nicht, wende ich mich ans API-Forum)

Verfasst: 14.08.2007 19:37
von ts-soft
Ist eine ziemlich grosse Strukture, aber in PB vordefiniert:

Code: Alles auswählen

; Structure OPENFILENAME
;   lStructSize.l
;   hWndOwner.l
;   hInstance.l
;   lpstrFilter.l
;   lpstrCustomFilter.l
;   nMaxCustFilter.l
;   nFilterIndex.l
;   lpstrFile.l
;   nMaxFile.l
;   lpstrFileTitle.l
;   nMaxFileTitle.l
;   lpstrInitialDir.l
;   lpstrTitle.l
;   Flags.l
;   nFileOffset.w
;   nFileExtension.w
;   lpstrDefExt.l
;   lCustData.l
;   lpfnHook.l
;   lpTemplateName.l
; EndStructure
; 
Define.OPENFILENAME of
of\lStructSize = SizeOf(OPENFILENAME)
of\hWndOwner = WindowID(0) ; handle
of\hInstace = GetModuleHandle_(0)

GetOpenFileName_(of)
Mußt noch vervollständigen :wink:

Verfasst: 14.08.2007 21:34
von NicTheQuick
Danke, ts-soft!

Hab mir mal schnell was zusammengebaut. Ich machs dann mal noch in die
"Codes, Tipps & Tricks"-Ecke.