From: SourceForge.net <no...@so...> - 2009-09-01 17:47:16
|
Bugs item #2844962, was opened at 2009-08-26 10:21 Message generated for change (Settings changed) made by dgp You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2844962&group_id=10894 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: 09. Linked C Variables Group: current: 8.6b1 Status: Open Resolution: None >Priority: 5 Private: No Submitted By: Karl C. Hansen (kchansen) Assigned to: Don Porter (dgp) Summary: Tcl_UpdateLinkedVar does not trigger tk widget updates Initial Comment: Also tested in 8.5.7, same behavior. OS Platform & Version WinXP with SP3 Problem Behavior Updates to linked C variables do not trigger widget updates. If I update a Tcl variable that is tied to a widget, the widget is automatically updated, presumably via hooks similar to the trace mechanism. Unfortunately, this does not seem to occur if the variables are tied to C variables. Calling Tcl_UpdateLinkedVar() *does* update the Tcl-side, since the following proc demonstrates the updates are occurring by displaying the Tcl-side values every two seconds when called via "Update 2000": proc Update {interval} { if {$::Thresh} { puts "***************************************************************" puts "Red: $::RMax" puts "Green: $::GMax" puts "Blue: $::BMax" puts "Interval $interval" update } after $interval "Update $interval" } Even though the Tcl variables reflect the updates, the widget values DO NOT refresh until I manipulate the widget window (e.g. resize). Below are the pertinent code snippets. I originally tried defining R/G/BMax as longs, and using them directly, but it occurred to me that perhaps the update needed to have string variables since the widgets use "-textvariable" options. Changing the code to the below code had the same behavior. I also tried calling Tcl_InvalidateStringRep() in the same C routine which calls Tcl_UpdateLinkedVar() with no changes to behavior. ***tcl*** label .v2.lrmax.rMax -textvariable ::RMax label .v2.lgmax.gMax -textvariable ::GMax label .v2.lbmax.bMax -textvariable ::BMax ***init*** sRMax = Tcl_Alloc(256); sGMax = Tcl_Alloc(256); sBMax = Tcl_Alloc(256); Tcl_LinkVar(theInterp, "::RMax", (char *) &sRMax, TCL_LINK_STRING | TCL_LINK_READ_ONLY); Tcl_LinkVar(theInterp, "::GMax", (char *) &sGMax, TCL_LINK_STRING | TCL_LINK_READ_ONLY); Tcl_LinkVar(theInterp, "::BMax", (char *) &sBMax, TCL_LINK_STRING | TCL_LINK_READ_ONLY); ***update*** sprintf(sRMax, "%lu", RMax); Tcl_UpdateLinkedVar(mainInterp, "::RMax"); sprintf(sGMax, "%lu", GMax); Tcl_UpdateLinkedVar(mainInterp, "::GMax"); sprintf(sBMax, "%lu", BMax); Tcl_UpdateLinkedVar(mainInterp, "::BMax"); ---------------------------------------------------------------------- >Comment By: Don Porter (dgp) Date: 2009-09-01 13:47 Message: oops. sorry, after looking, I can't work with that demo kit. I don't do Windows. I'll open the sources in case they adapt easily. ---------------------------------------------------------------------- Comment By: Karl C. Hansen (kchansen) Date: 2009-08-29 19:06 Message: Thanks for looking at this! Unzip the file "CleanExample.zip" to an empty directory. It contains four files: VidKt.dll -- A video toolkit with Tcl/Tk hooks (display video in any frame! :) ) (This dll is copyright 2009, Karl C. Hansen, All rights reserved.) It is provided to assist with debugging this issue. Callback.cpp -- The video callback hook that serves up frames to the Tcl code. Also renders frames into the display window. TclUtils.cpp -- The Tcl-side of the interface, simply counts the frames. Also handles initialization of the global variables. vt.tcl -- builds the video control panel, designates the display window, creates a window to show the counter, starts the video stream. Shows the Tcl console. Clicking on "Show Updates" in the little counter window starts displaying the current value of Counter every two seconds. Counter is changing when displayed via Tcl code, but not in the little widget. If you resize the window displaying Counter, the value will update. If you drag *any* window in front of the counter window then away, the value updates. It really looks like the widget just is not redrawing even though the text variable has changed.... ---------------------------------------------------------------------- Comment By: Karl C. Hansen (kchansen) Date: 2009-08-29 18:57 Message: I have created a stripped-down demo that does not depend on any external DLLs (other than my own DLL & Tcl/Tk dlls). I'll create a zip file with the source files for the Tcl interface and the tcl script demonstrating the problem. ---------------------------------------------------------------------- Comment By: Don Porter (dgp) Date: 2009-08-27 17:58 Message: It might be helpful if the original reporter would attach some working demos to this report. Then there could be less guessing and more analysis. ---------------------------------------------------------------------- Comment By: Don Porter (dgp) Date: 2009-08-27 17:55 Message: Ah, perhaps the widgets are being updated just fine, but their displayed appearance does not reflect the new values yet because the event loop has not yet processed idle handlers? Any chance that is the real problem here? ---------------------------------------------------------------------- Comment By: Don Porter (dgp) Date: 2009-08-27 17:54 Message: Are you calling Tcl_UpdateLinkedVar() within the handler of a trace on the linked Tcl variable? If not, I'm not seeing easily how you could have the failure you report. The guts of Tcl_UpdateLinkedVar() is simply a call to Tcl_ObjSetVar2() which should trigger write traces in this context just the same as it does in any other context. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2844962&group_id=10894 |