Probleme mit OpenWindow() und WaitWindowEvent()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Probleme mit OpenWindow() und WaitWindowEvent()

Beitrag 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
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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?
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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)
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Glaube ich habs einmal ne sinnlose Linked List und doppelter WaitWindowEvent() Aufruf böses Faul
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

ARGH immer noch zum heulen wie soll ich das finden und vor allem nach was soll ich suchen?
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Antworten