Skullcode 0 Posted July 9, 2020 (edited) is it safe to access VCL Controls directly from Twsocket DataAvailable event. or it needs to be synchronized ? as example procedure Tchatu.wsocketDataAvailable(Sender: TObject; ErrCode: Word); var datastr : string; begin datastr := wsocket.ReceiveStrW(CP_UTF8); memo1.lines.add(datastr); end; is it safe that way ? Edited July 9, 2020 by Skullcode Share this post Link to post
Angus Robertson 574 Posted July 9, 2020 Most ICS applications do not use threads so synchronise is not needed, However receiving data is blocked while you do anything in the OnDataAvailable event so not a good idea to update a memo if you are expecting to receive a lot of data. Angus Share this post Link to post
Skullcode 0 Posted July 9, 2020 can you guide me on how to update the memo safely in that case ? i am expecting to receive a lot of data Share this post Link to post
Remy Lebeau 1397 Posted July 9, 2020 40 minutes ago, Skullcode said: is it safe to access VCL Controls directly from Twsocket DataAvailable event. or it needs to be synchronized ? I don't use ICS, so I don't know the answer to that. However, an easy way to find out is to simply have the event handler compare the return value of the Win32 GetCurrentThreadId() function against the value of the RTL's MainThreadID variable. If the values match, the event is run in the UI thread and accessing UI controls is safe, otherwise access needs to be synchronized. 12 minutes ago, Skullcode said: can you guide me on how to update the memo safely in that case ? i am expecting to receive a lot of data If the TWSocket is running in the context of the main UI thread, then whether you do the logic in the OnDataAvailable event or in another UI event, you are still going to block subsequent data receiving while the TMemo is busy adding data. I would say don't worry about it unless it proves to be a real bottleneck, in which case you can then either move the TWSocket to another thread that posts new data to the main UI thread asynchronously so as not to block the socket, or else perhaps put new data into a queue somewhere and then use a timer to periodically dump the queue into the TMemo. 1 Share this post Link to post
Angus Robertson 574 Posted July 9, 2020 The main issue is you rarely want to put a lot of data into a memo, you can not view it while being received since it is updated so often, unless you only want to see the last few lines or are receiving data slowly, like alarm signals or something. The most efficient way to update a log window is to write data for display to a buffer (simple string is fine) and then use a timer in the application to empty the buffer to the TMemo every one to two seconds, which is about as often you can see it. That is exactly what more recent ICS samples do, like OverbyteIcsHttpRestTst1.pas, the AddLog proc builds the line and writes a file, the TimerLogTimer event updates the TMemo. In some applications I simply discard most of the log lines if there are hundreds arriving each second. Angus Share this post Link to post