Programm nur eine Instanz, aber wie ProgramParam. übergeben?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von STARGÅTE »

Nein auch dort nicht ...

Code: Alles auswählen

Text.s = "Hallo"

CopyData.COPYDATASTRUCT
CopyData\cbData = StringByteLength(Text) + SizeOf(Character)
CopyData\lpData = @Text

OpenWindow(1,100,100,100,100,"1")
OpenWindow(2,300,100,100,100,"2")

SendMessage_(WindowID(2), #WM_COPYDATA, WindowID(1), @CopyData)
;SendMessage_(WindowID(2), #WM_CLOSE, 0, 0)

Procedure WIN_MAIN_CB(hWnd, Msg, wParam, lParam)
  Select Msg
    Case #WM_COPYDATA
      Debug "COPYDATA"
  EndSelect  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 

SetWindowCallback(@WIN_MAIN_CB())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      CloseWindow(EventWindow())
  EndSelect
Until #False
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von ts-soft »

Wie wäre es, das Callback vor dem SendMessage zu erstellen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von STARGÅTE »

:freak: Ubs, naja solche Calbacks sind halt "Nur für erfahrene Programmierer"

Zum abschluss mal meine fertige Version zum testen:

Code: Alles auswählen

Procedure.i AllocateSharedMemory(Name.s, Size.q)
  Protected HandleMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE|#SEC_COMMIT|#SEC_NOCACHE, 0, Size, @Name)
  If HandleMap
    ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
  EndIf
EndProcedure

Procedure.i ReAllocateSharedMemory(Name.s)
  Protected HandleMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
  If HandleMap
    ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
  EndIf
EndProcedure

Procedure ReceiveCopyData(hWnd, Msg, wParam, lParam)
  Protected *CopyData.COPYDATASTRUCT
  Select Msg
    Case #WM_COPYDATA
      *CopyData.COPYDATASTRUCT = lParam
      Debug "RECEIVE: "+PeekS(*CopyData\lpData)
  EndSelect  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 

Procedure SendCopyData(WindowID, Text.s)
  Protected CopyData.COPYDATASTRUCT, Window.i
  CopyData\cbData = StringByteLength(Text) + SizeOf(Character)
  CopyData\lpData = @Text
  Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Invisible)
  SendMessage_(WindowID, #WM_COPYDATA, WindowID(Window), @CopyData)
  While WindowEvent() : Wend
EndProcedure
  
Procedure FirstInstanceWindowID(Name.s, WindowID.i)
  Protected MutexName.s  = "MUTEX_"+MD5Fingerprint(@Name, StringByteLength(Name))
  Protected MemoryName.s = "MEMORY_"+MD5Fingerprint(@Name, StringByteLength(Name))
  Protected Result = CreateMutex_(0, 0, @MutexName)
  Protected *Buffer.Integer
  If Result
    If GetLastError_() = #ERROR_ALREADY_EXISTS
      ReleaseMutex_(Result)
      *Buffer = ReAllocateSharedMemory(MemoryName)
      ProcedureReturn *Buffer\i
    Else
      *Buffer = AllocateSharedMemory(MemoryName, SizeOf(Integer))
      *Buffer\i = WindowID
      ProcedureReturn #Null
    EndIf
  EndIf
EndProcedure



; Beispiel
;----------


OpenWindow(1, 0, 0, 200, 200, "Fenster", #PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

SetWindowCallback(@ReceiveCopyData(), 1)

WindowID = FirstInstanceWindowID("Fenster", WindowID(1))
If WindowID
  SendCopyData(WindowID, "Hallo Welt")
  End
Else
  HideWindow(1, #False)
EndIf

Debug "Hallo Welt"

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Einfach zwei mal starten :wink:


Das ich das CopyData im WaitWindowEvent() bekommen würde, wäre mir aber lieber :|
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von ts-soft »

STARGÅTE hat geschrieben:Das ich das CopyData im WaitWindowEvent() bekommen würde, wäre mir aber lieber :|
Warum? WaitWindowEvent() ist leider unter Windows meist die schlechtere Wahl. Ob es
bestimmte Messages sind, Timer usw..
Ich lagere lieber möglichst viel ins Callback aus, dann weiß ich, das es funktioniert :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von STARGÅTE »

>> Warum?
Weil die Sachen da drin asynchron zum Programm laufen, dass heißt, ich muss die Prozeduren die darin aufgerufen werden (zB das Öffnen der Dateien die übergeben wurden) ThreadSicherheit machen.
Aber das nur nebenbei ...

Im eigentlich Projekt habe ich eh schon Callbacks drin ... dort ist es also die ThreadSicherheit schon gegeben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von RSBasic »

STARGÅTE hat geschrieben:Im eigentlich Projekt habe ich eh schon Callbacks drin ... dort ist es also die ThreadSicherheit schon gegeben.
Dann kannst du dein bestehendes Callback doch einfach erweitern?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von STARGÅTE »

Ja kann ich ... ging das aus meiner Antwort nicht hervor ? ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm nur eine Instanz, aber wie ProgramParam. überge

Beitrag von ts-soft »

STARGÅTE hat geschrieben:>> Warum?
Weil die Sachen da drin asynchron zum Programm laufen
Nicht mehr und nicht weniger als im EventLoop. Callback sollte Threadsicher sein,
deshalb darf es das Callback ja auch nur in dem Thread geben, wo das Fenster erstellt wurde.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten