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

Re: Programm nur eine Instanz, aber wie ProgramParam. überge
Verfasst: 18.03.2011 20:12
von STARGÅTE

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
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

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.