I a have a multithread application (MIDAS) that makes uses of windows messages to communicate with itself.
MAIN FORM
The main form receives windows messages sent by the RDM LogData(‘DataToLog’)
Because windows messages are used they have the following attributes
- Received messages are Indivisible
- Received messages are Queued in the order they are sent
QUESTION:
Can you Suggest a better way doing this without using windows messages ?
MAIN FORM CODE
const UM_LOGDATA = WM_USER+1002; type TLogData = Record Msg : TMsgNum; Src : Integer; Data : String; end; PLogData = ^TLogData; TfrmMain = class(TForm) // private procedure LogData(var Message: TMessage); message UM_LOGDATA; public // end; procedure TfrmMain.LogData(var Message: TMessage); var LData : PLogData; begin LData := PLogData(Message.LParam); SaveData(LData.Msg,LData.Src,LData.Data); Dispose(LData); end;
RDM CODE
procedure TPostBoxRdm.LogData(DataToLog : String); var WMsg : TMessage; LData : PLogData; Msg : TMsgNum; begin Msg := MSG_POSTBOX_RDM; WMsg.LParamLo := Integer(Msg); WMsg.LParamHi := Length(DataToLog); new(LData); LData.Msg := Msg; LData.Src := 255; LData.Data := DataToLog; WMsg.LParam := Integer(LData); PostMessage(frmMain.Handle, UM_LOGDATA, Integer(Msg), WMsg.LParam); end;
EDIT:
Why I want to get rid of the windows messages:
- I would like to convert the application into a windows service
- When the system is busy – the windows message buffer gets full and things slows down
Use Named Pipes. If you don’t know how to use them, then now is the time to learn.
With named pipes, you can send any type of data structure (as long as both the server and the client know what that data structure is). I usually use an array of records to send large collections of info back and forth. Very handy.
I use Russell Libby’s free (and open-source) named pipe components. Comes with a TPipeServer and a TPipeClient visual component. They make using named pipes incredibly easy, and named pipes are great for inter-process communication (IPC).
You can get the component here. The description from the source is: // Description : Set of client and server named pipe components for Delphi, as // well a console pipe redirection component.
Also, Russell helped me out on Experts-Exchange with using an older version of this component to work in a console app to send/receive messages over named pipes. This may help as a guide in getting you up and running with using his components. Please note, that in a VCL app or service, you don’t need to write your own message loop as I did in this console app.