#PB_Web_Refresh verursacht immer einen Absturz

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

#PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
a²+b²=mc²
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
a²+b²=mc²
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag von Nero »

Kannst du eventuell stdin / stdout zur komunikation zwischen den progammen verwenden?
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag von funk.munich »

Hi Nero,

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

Danke + Gruß,
Daniel
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: #PB_Web_Refresh verursacht immer einen Absturz

Beitrag 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
Gruß, Frank
Antworten