Seite 2 von 2

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

Verfasst: 18.03.2011 19:56
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

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

Verfasst: 18.03.2011 19:59
von ts-soft
Wie wäre es, das Callback vor dem SendMessage zu erstellen :mrgreen:

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

Verfasst: 18.03.2011 20:12
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 :|

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

Verfasst: 18.03.2011 20:19
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:

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

Verfasst: 18.03.2011 20:24
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.

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

Verfasst: 18.03.2011 20:25
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?

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

Verfasst: 18.03.2011 20:27
von STARGÅTE
Ja kann ich ... ging das aus meiner Antwort nicht hervor ? ^^

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

Verfasst: 18.03.2011 20:28
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.