Seite 1 von 2
Probleme mit OpenWindow() und WaitWindowEvent()
Verfasst: 08.02.2009 15:00
von unix
Tag Erstmal.
und zwar hab ich je nen Prog geschrieben zur Kundenverwaltung naja meine Alpha Version ist fast fertig.
Nur hab ich nen "write error at adress 4" ab und zu hab nun bei einen WaitWindowEvent mal nen timeout reint nun kommt er wo anders.
Kann mir jemand sagen woher das kommt? habe PB 4.30 für x86 CPU OS WinXP.
Code:
http://www.delphin-software.de/1.00alpha.pb
Verfasst: 08.02.2009 15:05
von Kaeru Gaman
> "write error at adress 4"
also ein IMA. irgendwo verrümpelst du deinen Stack.
er versucht etwas in Adresse $00000004 zu schreiben, also hat er einen Variablenwert an der Stelle, wo eigentlich ein Pointer liegen sollte.
das läßt sich mit abgespecktem code kaum finden, weil der fehler dann nicht mehr auftritt.
du wirst nicht umhin kommen, alle deine vorgänge aufs genaueste zu durchleuchten.
Verfasst: 08.02.2009 15:08
von unix
also Stack soll das heissen das dieser voll sein kann??? und wenn ich suchen soll nach was sollte ich da suchen?? eher nach sinlosen variablen oder was meinst du?
Verfasst: 08.02.2009 15:14
von Kaeru Gaman
der Stack wird zum beispiel benutzt, um die Argumente an deine Procedures zu übergeben, um lokale Variablen drauf abzulegen, etc.
wenn du nun etwas völlig falsches machst, irgendwo, einen wert zu holen,
der nicht geschrieben wurde oder einen wert zu schreiben, der später nicht wieder geholt wird,
dann stimmt der Stack nicht mehr, und irgendwann, möglicherweise sehr viel später im verlauf,
wird ein variablenwert geholt wenn das programm einen pointer holen will, und dann kracht es.
> und wenn ich suchen soll nach was sollte ich da suchen??
tja... nach allem was falsch sein könnte.
sorry, klingt frustrierend, ist es auch.
Verfasst: 08.02.2009 15:17
von unix
Ah ok nun macht es sinn hab ne Thread Proc mit einen Wert der nicht benötigt wird Proc"Procedure.b OpenHTML(x)" hab ich gemacht um es als thread zu starten perfekt wäre die Proc aber so:"Procedure OpenHTML()" kann man sie dennoch als Thread öffnen bzw. kann es daran liegen das dieso Proc noch nicht im Declare-Block liegt?
[EDIT]
bekomme den fehler nun immer bei open window
Code: Alles auswählen
nr=OpenWindow(#PB_Any,0,0,640,520,mode$,#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Verfasst: 08.02.2009 15:22
von Kaeru Gaman
ja so lange du ihn nicht eliminierst sondern nur hin und her schubst, wird er immer wieder auftreten, nur jedesmal wo anders.
wie ich oben erklärt habe, es kracht dann, wenn ein unbrauchbarer wert vom stack geholt wird,
aber nicht dann, wenn das problem verursacht wird.
bei threads musst du mindestens einen wert fordern und auch übergeben.
benutzen musst du ihn nicht.
Verfasst: 08.02.2009 15:31
von unix
irgendwie hängt es mit diesem thread zusammen das Problem tritt nur auf wenn der Thread gestartet ist hier die Proc:
Code: Alles auswählen
Procedure OpenHTML(x)
nr=OpenWindow(#PB_Any, 247, 89, 700, 720, "HTML Viewer", #PB_Window_SystemMenu | #PB_Window_TitleBar )
UseGadgetList(WindowID(nr))
WebGadget(801, 0, 80, 700, 640, "about:blank")
EditorGadget(802, 0, 30, 700, 20)
TextGadget(803, 0, 10, 340, 20, "HTML Code von (Drag and Drop) hier Plazieren:")
TextGadget(804, 0, 60, 210, 20, "HTML Ansicht:")
EnableGadgetDrop(802,#PB_Drop_Text,#PB_Drag_None)
Quit10000=0
Repeat
Select WaitWindowEvent(100)
Case #PB_Event_Gadget
If EventGadget()=802
HTML$=GetGadgetText(802)
CreateFile(0,"C:\temp.html")
WriteString(0,HTML$)
CloseFile(0)
SetGadgetText(801,"C:\temp.html")
EndIf
Case #PB_Event_CloseWindow
Quit10000=1
EndSelect
Until Quit10000=1
CloseWindow(nr)
EndProcedure
und der Aufruf (Hauptschleife):
Code: Alles auswählen
If ConnectDatabase("myodbc","root","02384642") = 0
MessageRequester("ERROR","Cannot connect to Database")
End
EndIf
Open_Window_0()
ShowKunden()
Global Kunde.s, Auftrag.s
Repeat
WinEvent=WaitWindowEvent()
Select WinEvent
Case #PB_Event_Gadget
If EventGadget()=51+GetGadgetState(#Panel_2)
If EventType()=#PB_EventType_LeftDoubleClick
table$=GetTabName()
Select table$
Case "Kunden"
KID$=GetGadgetItemText(51+GetGadgetState(#Panel_2),GetGadgetState(51+GetGadgetState(#Panel_2)),0)
Kunde = KID$
DelTabIfExist("Aufträge")
DelTabIfExist("Rechnungen")
DelTabIfExist("Arbeitsplan")
DelTabIfExist("ResellerDaten")
ShowAuftraege(Kunde)
SetGadgetState(#Panel_2,CountGadgetItems(#Panel_2)-1)
Case "Aufträge"
AID$=GetGadgetItemText(51+GetGadgetState(#Panel_2),GetGadgetState(51+GetGadgetState(#Panel_2)),0)
Auftrag = AID$
DelTabIfExist("Rechnungen")
DelTabIfExist("Arbeitsplan")
DelTabIfExist("ResellerDaten")
Select AuswahlAuftrag()
Case 1
ShowRechnungen(Auftrag)
Case 2
ShowArbeitsplan(Auftrag)
Case 3
ShowResellerDaten(Auftrag)
EndSelect
SetGadgetState(#Panel_2,CountGadgetItems(#Panel_2)-1)
Case "Arbeitsplan"
Select AuswahlArbeitsplan()
Case 1
rechid$=GetGadgetItemText(51+GetGadgetState(#Panel_2),GetGadgetState(51+GetGadgetState(#Panel_2)),6)
If rechid$
RechnungZahlen(rechid$)
DelTabIfExist("Arbeitsplan")
ShowArbeitsplan(Auftrag)
SetGadgetState(#Panel_2,CountGadgetItems(#Panel_2)-1)
EndIf
Case 2
ag$=GetGadgetItemText(51+GetGadgetState(#Panel_2),GetGadgetState(51+GetGadgetState(#Panel_2)),0)
state$=InputRequester("Arbeitsplan","Arbeitschritt status:","bearbeitet")
DatabaseUpdate(0,"UPDATE Arbeitsplan SET state ='"+state$+"' WHERE AuftragID='"+Auftrag+"' AND Arbeitsgang='"+ag$+"'")
DelTabIfExist("Arbeitsplan")
ShowArbeitsplan(Auftrag)
SetGadgetState(#Panel_2,CountGadgetItems(#Panel_2)-1)
EndSelect
Case "Rechnungen"
rechid$=GetGadgetItemText(51+GetGadgetState(#Panel_2),GetGadgetState(51+GetGadgetState(#Panel_2)),0)
RechnungZahlen(rechid$)
DelTabIfExist("Rechnungen")
ShowRechnungen(Auftrag)
EndSelect
EndIf
If EventType() = #PB_EventType_DragStart
table$=GetTabName()
Select table$
Case "Kunden" : anz=8
Case "Aufträge" : anz=7
Case "Arbeitsplan" : anz=8
Case "Rechnungen" : anz=6
Case "ResellerDaten" : anz=5
EndSelect
Gadget=51+GetGadgetState(#Panel_2)
Text$="<table width='100%' border='1' cellspacing='0' cellpadding='2'>"
Text$ + "<tr>"
For i = 1 To anz
Text$ + "<td>" + GetGadgetItemText(Gadget,-1,i-1) + "</td>"
Next
Text$ + "</tr>"
For ii = 0 To CountGadgetItems(Gadget)-1
If GetGadgetItemState(Gadget,ii) & #PB_ListIcon_Selected
Text$ + "<tr>"
For i = 1 To anz
Text$ + "<td>" + GetGadgetItemText(Gadget,ii,i-1) + "</td>"
Next
Text$ + "</tr>"
EndIf
Next
Text$ + "</table>"
If Text$<>""
DragText(Text$ ,#PB_Drag_Copy)
EndIf
EndIf
EndIf
Case #PB_Event_Menu
MenuEvent=EventMenu()
Select MenuEvent
;-Menu Kunden
Case #MENU_9
ClearGadgetItems(#Panel_2)
AddKunde()
Case #MENU_11
ClearGadgetItems(#Panel_2)
DelKunde()
Case #MENU_12
ClearGadgetItems(#Panel_2)
ShowKunden()
;-Menu Aufträge
Case #MENU_13
AddAuftrag(Kunde)
DelTabIfExist("Aufträge")
ShowAuftraege(Kunde)
Case #MENU_15
ClearGadgetItems(#Panel_2)
DelAuftrag()
Case #MENU_16
ClearGadgetItems(#Panel_2)
ShowAuftraege("")
;-Menu Rechnungen
Case #MENU_21
ClearGadgetItems(#Panel_2)
ShowRechnungen("")
Case #MENU_22
RechnungZahlen(InputRequester("Rechnung","Rechnung begleichen. RechnungsID:",""))
Case #MENU_23
ClearRechnungen()
;-Menu Anzeigen
Case #MENU_24
ShowWin2("Konto")
Case #MENU_25
ShowWin2("Reseller")
Case #MENU_26
ShowWin2("Arbeitspläne")
Case #MENU_28
ShowWin("Hosting","SELECT * FROM Hosting")
Case #MENU_29
ShowWin("Webspace","SELECT * FROM Webspace")
Case #MENU_30
ShowWin("Mailspace","SELECT * FROM Mailspace")
Case #MENU_31
ShowWin("Traffic","SELECT * FROM Traffic")
Case #MENU_32
ShowWin("Datenbank","SELECT * FROM Datenbank")
Case #MENU_37
AddReseller()
Case #MENU_38
DelReseller()
Case #MENU_40
AddTarif()
Case #MENU_41
DelTarif()
Case #MENU_39
CreateThread(@OpenHTML(),0)
EndSelect
Case #PB_Event_CloseWindow
Quit=1
EndSelect
Until Quit=1
Verfasst: 08.02.2009 15:37
von unix
Glaube ich habs einmal ne sinnlose Linked List und doppelter WaitWindowEvent() Aufruf böses Faul
Verfasst: 08.02.2009 15:47
von unix
ARGH immer noch zum heulen wie soll ich das finden und vor allem nach was soll ich suchen?
Verfasst: 08.02.2009 15:48
von Kiffi
unix hat geschrieben:Glaube ich habs einmal ne sinnlose Linked List
das macht nix
unix hat geschrieben:und doppelter WaitWindowEvent() Aufruf
um genauer zu sein: 21 WaitWindowEvents sind es
Und für die Übersichtlichkeit böte es sich an, für die Gadgets Konstanten zu
verwenden. Somit hättest Du auch gleich eine potentielle Fehlerquelle
vermieden.
Vermutung: WebGadget und Thread vertragen sich nicht. Siehe auch:
http://www.purebasic.fr/german/viewtopi ... 529#183529
Grüße ... Kiffi