From: SourceForge.net <no...@so...> - 2009-08-29 22:57:51
|
Bugs item #2844962, was opened at 2009-08-26 10:21 Message generated for change (Comment added) made by kchansen 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: Jeffrey Hobbs (hobbs) 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: 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 |