From: Brian G. <bgr...@mo...> - 2008-02-14 20:18:37
|
Alexandre Ferrieux wrote: > >> In gitk (my git commit visualizer, written in Tcl/Tk) I currently have >> some moderately complicated code to work around this problem, which >> mostly works but is not completely satisfactory. What I do is to >> remove the fileevent handler every time it gets called, and add an >> idle handler which re-adds the fileevent handler on the channel. Even >> with this, and with a limit on how much data the handler processes >> (which keeps the time taken by the handler to around 50ms) the UI is >> still somewhat laggy and jerky. >> > > Are you sure no hidden blocking operation occurs in the handler ? 50ms > shouldn't be that jerky... > > Now of course, there're various overheads, like registering the > handler back and forth, and also the internal [after 0] used for > fileevents. To smooth all this, what about replacing the fileevent by > a simple periodic task and non-blocking reads ? It also gives you more > control over the maximum bandwidth. > Turning it into a polling situation is certainly one way to solve the problem. That will give the reader more control, but it can starve the writer. I've solved this problem differently by using an intermediate file. The writer writes to a temporary file, so assuming enough disk space is available, it will never block. The reader can then read the same file at it's leisure, breaking the speed dependencies of the 2 tasks. This works extremely well, letting the work horse data generator to run at full batch speeds while having a GUI that appears to keep up. I also have another control channel that allows to 2 processes to re-sync the temporary file if needed, for example, if I want to limit the temporary file size, then the two can handshake and when the reader gets caught up, the file is zeroed and processing resumes. In plumbing, the water flow is limited by the smallest pipe! -Brian -- # "Don't be ridiculous. Everyone knows there are no Secret # Tcl Illuminati." # -- Donal Fellows ------------------------------------------------------------- -- Mentor Graphics Corp. -- -- 8005 SW Boeckman Road 503.685.7000 tel -- -- Wilsonville, OR 97070 USA 503.685.0921 fax -- ------------------------------------------------------------- -- Technical support ............ mailto:su...@mo... -- -- Sales and marketing info ....... mailto:sa...@mo... -- -- Licensing .................... mailto:li...@mo... -- -- Home Page ........................ http://www.model.com -- ------------------------------------------------------------- |