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