Seite 1 von 1

#PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 05.05.2011 22:10
von funk.munich
Hallo zusammen,

ein externes Programm (geschrieben in C++, mit boost Thread) soll eine PB DLL benutzen.
In der DLL existieren zwei public Funktionen zum Aufruf. Generell funktioniert das auch,
aber immer wenn ich mit der zweiten Funktion den Status des offenen Fensters überprüfe,
d.h. wenn das Fenster geöffnet ist, soll der Inhalt der Site aktualisiert werden. Und genau
dann stürzt mir das Programm ab :-(

Am besten füge ich mal den Bsp.-Code hinzu, damit ihr seht was ich meine.
main.pb

Code: Alles auswählen

IncludeFile "Global.pbi"
IncludeFile "GUI.pbi"

ProcedureDLL init()
  loadFramework()  
EndProcedure

ProcedureDLL sync(flag.l)
  CreateThread(@validateWindowState(), flag)
EndProcedure
Global.pbi

Code: Alles auswählen

#MAIN_WND = 2
#WEB_WND = 1
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

Declare crtPopupMenu()
Declare crtSysTray()
Declare crtWindow()
Declare validateWindowState(flag.l)
Declare loadFramework()
Declare windowHandler()
GUI.pbi

Code: Alles auswählen

IncludeFile "Global.pbi"

Procedure windowHandler()
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow
      Quit = 1
      CloseWindow(#MAIN_WND)
    EndIf
  Until Quit = 1  
EndProcedure

Procedure crtWindow()
  If OpenWindow(#MAIN_WND, 0, 0, 500, 500, "test", #FLAGS)
    WebGadget(#WEB_WND, 1, 1, 499, 499, "http://www.heise.de")
    windowHandler()    
  EndIf  
EndProcedure

Procedure validateWindowState(flag.l)
  If WindowID(#MAIN_WND)
    ; window is valid and initialized
    If IsGadget(#WEB_WND)
      SetGadgetState(#WEB_WND, #PB_Web_Refresh) ; UND GENAU HIER CRASHED ES DANN!!
    EndIf
  Else
    ; window does not exist, create new one
    crtWindow()
  EndIf  
EndProcedure

Procedure loadFramework()
  crtWindow()
EndProcedure

Wenn ich ein andere Methode z.B. GetGadgetAttribute(..,..) benutze erhalte ich den korrekten Wert.

Hm ... ich stehe da zur Zeit ein wenig aufm Schlauch und wäre dankbar für jede Hilfe.

VG,
Daniel

PS Wenn ich ein einfaches Programm in PB mit dem Refresh ausführe, funktioniert es einwandfrei.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 500, 500, "test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    WebGadget(1, 10, 30, 499, 499, "http://heise.de")
    ButtonGadget(2, 1, 1, 100, 20, "Refresh")
    
    Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow
      Quit = 1
      CloseWindow(0)
    EndIf
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 2
          SetGadgetState(1, #PB_Web_Refresh)
      EndSelect
      
    EndIf
    
    Until Quit = 1
EndIf

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 05.05.2011 22:16
von Kiffi
AFAIK verträgt sich das WebGadget() nicht mit Threads.

(finde das passende Posting hier im Forum auf die Schnelle
nicht mehr. Kannst ja mal ein wenig recherchieren (auch
im englischen Forum))

Grüße ... Kiffi

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 06.05.2011 12:21
von funk.munich
Hi Kiffi,

danke für die Info. Das ist ja kacke ... :-(

Hast Du ne Ahnung, wie ich einer laufenden DLL ein Signal (also ein Signal Handler; kenne ich
teilweise unter C/C++) übergeben kann?

Also z.B. über taskkill und einen undefinierten nummer (z.B. -7) ein Signal an eine ausführende
Datei/DLL weiterleiten, die diese dann über sagen wir mal ein Callback auffangen kann und darauf
weitere Schritte anstösst. Oder eben lokale client <-> server Verbindung.

Mit dieser Thematik beschäftige ich mich erst seit gestern und bin somit noch ein wenig auf der
Suche nach hilfreichen Infos in PB.

Eine Sache habe ich schon gefunden:
http://forums.purebasic.com/german/view ... l+abfangen
... die ist aber jedoch für Linux und nicht Windows. Unter Windows erhalte ich die Fehlermeldung,
dass signal_ nicht bekannt ist.

Danke im voraus,
Daniel

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 06.05.2011 13:30
von funk.munich
Hi,

ich bin es erneut ...

Gibt es eine Möglichkeit ein Header Datei, indem Fall "signal.h" in PureBasic zu benutzen?

Ich hatte jetzt den "Import" mal gelesen und darüber kann ich ja existierende *.lib Dateien
einbinden und somit auf die jeweiligen Funktionen zugreifen. D.h. indem Fall, wenn es
möglich wäre aus der "signal.h" (plus Abhängigkeiten) eine LIB zu erzeugen, z.B. unter
Windows auf Signal Handler zuzugreifen?!

Verstehe ich das richtig oder habe ich da was falsch verstanden?

Danke + Gruß,
Daniel

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 06.05.2011 13:48
von Kiffi
mit dem ganzen C-Zeugs kenne ich mich nicht aus; deshalb
kann ich Dir da leider nicht weiterhelfen.

Allerdings verstehe ich auch nicht ganz, was Du mit Deinem
Programm / DLL eigentlich machen willst. Erklär mal. Vielleicht
kann man das ganze auch anders regeln.

Grüße ... Kiffi

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 06.05.2011 14:08
von funk.munich
:-)

Also es geht darum das die C++ Anwendung generell im Hintergrund Arbeiten durchführt und
bei bestimmten Aktionen ein Fenster mit einer lokalen html Datei anzeigen soll.

Ablauf:

- Programm (läuft im Hintergrund) wird gestartet (nimmt Initialisierung vor, unter anderem Aufruf der externen DLL)
- Aufruf der externen DLL bezweckt ein Erzeugen von "SysTray" u. "CreatePopupMenu" zur
sichtbaren Darstellung im Windows SystemTray für den Benutzer

Szenario 1:

- Benutzer möchte manuell die lokale html Seite aufrufen
- Aufruf über SystemTray

Szenario 2:

- Programm reagiert auf eine bestimmte Aktion und soll ein Signal an die DLL senden
- das Signal soll bezwecken, dass die lokale html Seite ohne Benutzeraktion angezeigt wird
- wenn das noch nicht angezeigt wird, soll es aufgerufen werden
- wenn das Fenster schon angezeigt wird, soll der Inhalt (indem Fall die html Seite) neu
geladen werden

Infos:

- das Programm benutzt verschiedenste Threads zum Aufruf anderer Aktionen, darunter fallen
zwei Threads für die DLL. Thread 1 zum initialisieren, Thread 2 zum kontinuierlichen versenden
eines Signals

- die GUI würde ich gerne mit PB erstellen, da PB das Erstellen von UI Anwendungen meiner
Meinung nach vereinfacht, anstatt dies mit C++/QT/wxWidget etc. umzusetzen

- generell möchte ich gerne Backend und Frontend einfach voneinander getrennt halten.

Ich hoffe ich habe es halbwegs verständlich geschrieben ...

Danke + Gruß,
Daniel

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 07.05.2011 19:30
von Nero
Kannst du eventuell stdin / stdout zur komunikation zwischen den progammen verwenden?

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 09.05.2011 09:03
von funk.munich
Hi Nero,

hättest Du dazu ein Bsp.? Wie meinst Du das genau?

Danke + Gruß,
Daniel

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 09.05.2011 10:38
von Nero
Ein Bsp. hab ich leider gerade nicht zur hand.
Da meine pause gleich vorbei ist habe ich nur mal schnell bisl im board gesucht.
Schau dir mal diesen Thread hier an http://www.purebasic.fr/german/viewtopi ... hilit=pipe

Re: #PB_Web_Refresh verursacht immer einen Absturz

Verfasst: 09.05.2011 14:23
von Frabbing
Ich denke, es ist nötig, deine Threads (besser) zu syncronisieren. Hatte selber mal so einen Fall mit einer Dll. Zwar selten mit Absturz, aber dafür geriet die Anzeige immer fürchterlich durcheinander.
Hab dann Semaphoren eingebaut, und von da an lief alles glatt. Lies dich dort mal ein: http://msdn.microsoft.com/en-us/library ... 85%29.aspx