Re: [twsocket] ReadLine
> > Defenitely not. Depending on the network traffic, you could easily have > > something like one thousand messages per second in the queue. > > The message loop must run full speed. > > > > As I said, you must either provide a callback to the DLL to call the > > application's message pump, or have you own thread with his > > own message queue and message pump (easier). > > Okay, timer doesn't work for another reason: the timer component needs > messages itsself so doesn't fire. > > Setting up a thread and simply execute application.processmessages in it > over and over doesn't work either. In a thread, you doesn't call Application.ProcessMessages but the own message pump of the thread that you must first create. > How has that messagepump to look like? Any example? Look into IcsDll1.pas delivered with ICS (there are othe rmultithreaded sample, just do a search...) -- [EMAIL PROTECTED] http://www.overbyte.be -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
Francois Piette schrieb: > > > Defenitely not. Depending on the network traffic, you could easily have > something like one thousand > messages per second in the queue. The message loop must run full speed. > > As I said, you must either provide a callback to the DLL to call the > application's message pump, or > have you own thread with his own message queue and message pump (easier). Okay, timer doesn't work for another reason: the timer component needs messages itsself so doesn't fire. Setting up a thread and simply execute application.processmessages in it over and over doesn't work either. How has that messagepump to look like? Any example? Greetings and thanks so far Markus -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
> Hm, could that message pump be realised by a timer in the dll where the > application.processmessages is called each onTimer event? You can not use a TTimer since that uses windows messages and thus needs the message loop. But you can use the windows SetTimer API with a callback. I use such a timer to close a database in a DLL. Angus procedure TimerProc (Wnd: HWnd; Msg: Integer; Id: Integer; CurrentTime: DWord) ; stdcall ; begin SetTimerEnabled (false) ; doDBClose ; end; procedure SetTimerEnabled (const Value: Boolean); begin if TimerEnabled = Value then Exit; if Value then begin TimerHandle := SetTimer (0, 0, TimerInterval, @TimerProc) ; end else begin if TimerHandle <> 0 then begin KillTimer (0, TimerHandle) ; TimerHandle := 0 ; end; end; TimerEnabled := Value; end; -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
- Original Message - From: "Markus Humm" <[EMAIL PROTECTED]> To: "ICS support mailing" Sent: Monday, May 02, 2005 6:29 AM Subject: Re: [twsocket] ReadLine You _always_ need a message pump. If the calling program doesn't provide one, you must provide one and to have one without interfering with the calling DLL it is better to have all you stuff in a thread. Consider a thread as a program within a program. If you don't want to have a thread, you must ask the host application to provide a hook for Application.ProcessMessages (or equivalent if the host application is written using another language). You can do that by using a callback. Now you've worried me a bit... Sorry. You are now back to reality. Hm, could that message pump be realised by a timer in the dll where the application.processmessages is called each onTimer event? Greetings Markus Hehe, TTimer relies on messages also. Dan -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
> > You _always_ need a message pump. If the calling program doesn't provide > > one, you must provide one and to have one without interfering with the > > calling DLL it is better to have all you stuff in a thread. Consider a > > thread as a program within a program. > > If you don't want to have a thread, you must ask the host application to > > provide a hook for Application.ProcessMessages (or equivalent if the host > > application is written using another language). You can do that by using a > > callback. > Hm, could that message pump be realised by a timer in the dll where the > application.processmessages is called each onTimer event? Defenitely not. Depending on the network traffic, you could easily have something like one thousand messages per second in the queue. The message loop must run full speed. As I said, you must either provide a callback to the DLL to call the application's message pump, or have you own thread with his own message queue and message pump (easier). -- [EMAIL PROTECTED] http://www.overbyte.be -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
> > You _always_ need a message pump. If the calling program doesn't provide > one, you must provide one and to have one without interfering with the > calling DLL it is better to have all you stuff in a thread. Consider a > thread as a program within a program. > > If you don't want to have a thread, you must ask the host application to > provide a hook for Application.ProcessMessages (or equivalent if the host > application is written using another language). You can do that by using a > callback. > > >>Now you've worried me a bit... > > > Sorry. You are now back to reality. > Hm, could that message pump be realised by a timer in the dll where the application.processmessages is called each onTimer event? Greetings Markus -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
> Do I really need a message pump in this case? You always need a message pump for ICS component (except TPing component) to work. Without message pump, no winsock event ! > I think not, since the > program never spends long times in the dll, because the data is given > back to the caller very fast via callbacks. Windows as the ability to handle 500.000 messages per second on a today's desktop computer. So "long time" is very relative. 100 mS can be a long time. > But: in the near future the caller will be another dll. What's then? > I don't know whether this part of the program will contain more than a > starter stub later. Who needs a message pump then? You _always_ need a message pump. If the calling program doesn't provide one, you must provide one and to have one without interfering with the calling DLL it is better to have all you stuff in a thread. Consider a thread as a program within a program. If you don't want to have a thread, you must ask the host application to provide a hook for Application.ProcessMessages (or equivalent if the host application is written using another language). You can do that by using a callback. > Now you've worried me a bit... Sorry. You are now back to reality. -- [EMAIL PROTECTED] http://www.overbyte.be - Original Message - From: "Markus Humm" <[EMAIL PROTECTED]> To: "ICS support mailing" Sent: Sunday, May 01, 2005 5:35 PM Subject: Re: [twsocket] ReadLine > [snip] > >> > >>The thing is that the code is in a dll, so application.processmessages > >>might not work here. Or does it? The timeout will be rather short anyhow > >>(ca. 50 ms) and I think i do it with GetTickCount, which should be > >>sufficient here and more easy to use than a at this place timer. > >>Or is there anything bad with these ideas? > > So far the dll works (ICS asynchronous transfer included), as the > calling application is a Delphi one which calls > application.processmessages from time to time. > > Do I really need a message pump in this case? I think not, since the > program never spends long times in the dll, because the data is given > back to the caller very fast via callbacks. > But: in the near future the caller will be another dll. What's then? > I don't know whether this part of the program will contain more than a > starter stub later. Who needs a message pump then? > Now you've worried me a bit... > > Greetings > > Markus > > -- > To unsubscribe or change your settings for TWSocket mailing list > please goto http://www.elists.org/mailman/listinfo/twsocket > Visit our website at http://www.overbyte.be > -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
[snip] >> >>The thing is that the code is in a dll, so application.processmessages >>might not work here. Or does it? The timeout will be rather short anyhow >>(ca. 50 ms) and I think i do it with GetTickCount, which should be >>sufficient here and more easy to use than a at this place timer. >>Or is there anything bad with these ideas? So far the dll works (ICS asynchronous transfer included), as the calling application is a Delphi one which calls application.processmessages from time to time. Do I really need a message pump in this case? I think not, since the program never spends long times in the dll, because the data is given back to the caller very fast via callbacks. But: in the near future the caller will be another dll. What's then? I don't know whether this part of the program will contain more than a starter stub later. Who needs a message pump then? Now you've worried me a bit... Greetings Markus -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
> The thing is that the code is in a dll, so application.processmessages > might not work here. Or does it? It depend on the caller of the DLL ! You may as well be called from a thread. Calling the message pump from a DLL is risky when you don't know anything about the calling process. If you have to write a DLL that works in all (well most) cases, then you should probably put all your stuff into a separate thread with his own message pump. The function exposed by the DLL would create the thread suspended, pass all parameters, resume the thread and wait until the thread terminate, then return to the caller. Within the thread, you can do almost what you want, including calling the thread's own message pump. You have to have a message pump or the ICS component will not work within a thread. There are several samples with components running in a thread. -- [EMAIL PROTECTED] http://www.overbyte.be - Original Message - From: "Markus Humm" <[EMAIL PROTECTED]> To: "ICS support mailing" Sent: Sunday, May 01, 2005 3:56 PM Subject: Re: [twsocket] ReadLine > Francois PIETTE schrieb: > > As expressed in the source code, ReadLine is deprecated. Anyway, it doesn't > > fit correctly with UDP protocol which is datagram oriented. Using "lines" > > with such protocol is strange. > > > > > >>Now I have the problem that at one place in the program I need > >>synchronus communication. I send out one byte and if I receive the same > >>byte within some short timeout, I assume that the device I'm talking to > >>has a echo mode. > > > > > > Send your byte then program a loop waiting for the evnt OnDataAvailable to > > occur before a given time. Not the best practice, but that's how you can > > implement synchronous operation if you really need this (you can ALWAYS > > avoid synchronous operation). > > > > When you are in your wait loop, you must process events or your application > > will be locked. You must do something like that (not checked, out of my > > head) : > > > > FReceiveFlag := FALSE; > > WSocket1.Send(...your one byte data ); > > while not FReceiveFlag do begin > > DummyHandle := INVALID_HANDLE_VALUE; > > MsgWaitForMultipleObjects(0, DummyHandle, FALSE, 1000, > > QS_ALLINPUT + QS_ALLEVENTS + > > QS_KEY + QS_MOUSE); > > Application.ProcessMessages; > > if Application.Terminated then > > break; > > end; > > > > OnDataAvailable handler will set the FReceiveFlag variable to TRUE. > > You can also use a TTimer to check for timeout. > > > Thanks for the reply, I will consider that tomorrow. > Normally I do asynchronos communication, but for the first test wether > my communication partner has echo or not I don't want this, I simply > want this one synchronous. > > The thing is that the code is in a dll, so application.processmessages > might not work here. Or does it? The timeout will be rather short anyhow > (ca. 50 ms) and I think i do it with GetTickCount, which should be > sufficient here and more easy to use than a at this place timer. > Or is there anything bad with these ideas? > > Greetings > > Markus Humm > > -- > To unsubscribe or change your settings for TWSocket mailing list > please goto http://www.elists.org/mailman/listinfo/twsocket > Visit our website at http://www.overbyte.be > -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
Francois PIETTE schrieb: > As expressed in the source code, ReadLine is deprecated. Anyway, it doesn't > fit correctly with UDP protocol which is datagram oriented. Using "lines" > with such protocol is strange. > > >>Now I have the problem that at one place in the program I need >>synchronus communication. I send out one byte and if I receive the same >>byte within some short timeout, I assume that the device I'm talking to >>has a echo mode. > > > Send your byte then program a loop waiting for the evnt OnDataAvailable to > occur before a given time. Not the best practice, but that's how you can > implement synchronous operation if you really need this (you can ALWAYS > avoid synchronous operation). > > When you are in your wait loop, you must process events or your application > will be locked. You must do something like that (not checked, out of my > head) : > > FReceiveFlag := FALSE; > WSocket1.Send(...your one byte data ); > while not FReceiveFlag do begin > DummyHandle := INVALID_HANDLE_VALUE; > MsgWaitForMultipleObjects(0, DummyHandle, FALSE, 1000, > QS_ALLINPUT + QS_ALLEVENTS + > QS_KEY + QS_MOUSE); > Application.ProcessMessages; > if Application.Terminated then > break; > end; > > OnDataAvailable handler will set the FReceiveFlag variable to TRUE. > You can also use a TTimer to check for timeout. > Thanks for the reply, I will consider that tomorrow. Normally I do asynchronos communication, but for the first test wether my communication partner has echo or not I don't want this, I simply want this one synchronous. The thing is that the code is in a dll, so application.processmessages might not work here. Or does it? The timeout will be rather short anyhow (ca. 50 ms) and I think i do it with GetTickCount, which should be sufficient here and more easy to use than a at this place timer. Or is there anything bad with these ideas? Greetings Markus Humm -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
Re: [twsocket] ReadLine
As expressed in the source code, ReadLine is deprecated. Anyway, it doesn't fit correctly with UDP protocol which is datagram oriented. Using "lines" with such protocol is strange. > Now I have the problem that at one place in the program I need > synchronus communication. I send out one byte and if I receive the same > byte within some short timeout, I assume that the device I'm talking to > has a echo mode. Send your byte then program a loop waiting for the evnt OnDataAvailable to occur before a given time. Not the best practice, but that's how you can implement synchronous operation if you really need this (you can ALWAYS avoid synchronous operation). When you are in your wait loop, you must process events or your application will be locked. You must do something like that (not checked, out of my head) : FReceiveFlag := FALSE; WSocket1.Send(...your one byte data ); while not FReceiveFlag do begin DummyHandle := INVALID_HANDLE_VALUE; MsgWaitForMultipleObjects(0, DummyHandle, FALSE, 1000, QS_ALLINPUT + QS_ALLEVENTS + QS_KEY + QS_MOUSE); Application.ProcessMessages; if Application.Terminated then break; end; OnDataAvailable handler will set the FReceiveFlag variable to TRUE. You can also use a TTimer to check for timeout. -- [EMAIL PROTECTED] http://www.overbyte.be - Original Message - From: "Markus Humm" <[EMAIL PROTECTED]> To: Sent: Sunday, May 01, 2005 9:49 AM Subject: [twsocket] ReadLine > Hello, > > I'm using TWSocket for UDP communications, so far it works quite good. > Now I have the problem that at one place in the program I need > synchronus communication. I send out one byte and if I receive the same > byte within some short timeout, I assume that the device I'm talking to > has a echo mode. > > If I use ReadLine with a 50 ms timeout, my program handg, until the > close button is pressed (x right corner of the window). Then is > continues but hasn't read anything. If I don't press that button it > doesn't continue! > > How to use ReadLine properly? In the help was something with Wait > statet, but the property where you should assign that wait object to > doesn't exist (any more). > > Do you have a short sample? > > I'm using D2005 Arch. SP1 german on Windows XP SP2. > > Greetings > > Markus > > -- > To unsubscribe or change your settings for TWSocket mailing list > please goto http://www.elists.org/mailman/listinfo/twsocket > Visit our website at http://www.overbyte.be > -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
[twsocket] ReadLine
Hello, I'm using TWSocket for UDP communications, so far it works quite good. Now I have the problem that at one place in the program I need synchronus communication. I send out one byte and if I receive the same byte within some short timeout, I assume that the device I'm talking to has a echo mode. If I use ReadLine with a 50 ms timeout, my program handg, until the close button is pressed (x right corner of the window). Then is continues but hasn't read anything. If I don't press that button it doesn't continue! How to use ReadLine properly? In the help was something with Wait statet, but the property where you should assign that wait object to doesn't exist (any more). Do you have a short sample? I'm using D2005 Arch. SP1 german on Windows XP SP2. Greetings Markus -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be