Tcl#u LinkVar和Tcl#u updatelinkdvar是';t更新我的TCL变量 我是相对论新的C++,对TCL来说是很新的。我试图编写一个应用程序(C++中的一个和TCL中的一个),共享一个变量,名为tValue/< 目标是C++程序要求用户输入,并将该输入分配给tValk。然后,TCL程序应该更新其tValue

Tcl#u LinkVar和Tcl#u updatelinkdvar是';t更新我的TCL变量 我是相对论新的C++,对TCL来说是很新的。我试图编写一个应用程序(C++中的一个和TCL中的一个),共享一个变量,名为tValue/< 目标是C++程序要求用户输入,并将该输入分配给tValk。然后,TCL程序应该更新其tValue,c++,multithreading,tcl,C++,Multithreading,Tcl,我一直在搜索,但找不到其他可以尝试的东西 编辑:最初的TCL脚本是在“主”C++线程中执行的,但是C++线程等待TCL脚本完成。将调用TCL脚本的C++代码移到它自己的线程中,允许同时执行两个线程(这是实现这一点的唯一方法),但是Twitter仍然没有更新< /P> 以下是两个程序的源代码: test.cpp #include <tcl.h> #include <iostream> using namespace std; Tcl_Interp * interp =

我一直在搜索,但找不到其他可以尝试的东西

<>编辑:最初的TCL脚本是在“主”C++线程中执行的,但是C++线程等待TCL脚本完成。将调用TCL脚本的C++代码移到它自己的线程中,允许同时执行两个线程(这是实现这一点的唯一方法),但是Twitter仍然没有更新< /P> 以下是两个程序的源代码:

test.cpp

#include <tcl.h>
#include <iostream>

using namespace std;

Tcl_Interp * interp = Tcl_CreateInterp();
char * tValue = Tcl_Alloc(20);

void *thread_proc(void* x);

int main() {

    cout << "C++: INIT: " << Tcl_Init(interp) << "\n";

    cout << "C++: I'm alive, I'm alive, I'M ALIVE!!!\n";

    pthread_t t1;
    int res = pthread_create(&t1,NULL,thread_proc,NULL);

    int errLink = Tcl_LinkVar (interp, tValue, (char *) &tValue, TCL_LINK_STRING);

    cout << "C++: INTERP " << errLink << "\n";

    usleep(5000);

    cout << "C++: Well...\nC++: Has anything happened?\n";

    while (true) {
        cout << "C++: Enter a string\n";
        cin >> tValue;
        cout << "C++: You have entered " << tValue << "\n";
        Tcl_UpdateLinkedVar(interp, tValue);
    }

    return 1;
}

void *thread_proc(void* x) {
    cout << "C++ TP: Thread Launched: " << "\n";

    int errEval = Tcl_EvalFile(interp,"./test.tcl");

    cout << "C++ TP: EVAL: " << errEval << "\n";

    pthread_exit(NULL);
}

任何帮助都将不胜感激,我只是在努力敲击键盘让它工作。。。如果失败了…

正确的方法是首先认识到Tcl在多线程应用程序方面有一个弱点,或者说,有一个限制:它使用“单元线程”模型。这意味着在一个线程中完成的所有操作都必须与任何其他线程保持“分离”

具体来说,创建解释器的线程是唯一可以与该解释器交互的线程。这包括所有Tcl_xxx C API函数的使用。唯一的例外是Tcl_AsyncXXX API函数,这一点很重要

为了正确地跨线程使用链接变量,您不会从与Tcl线程分开运行的基于C的线程调用Tcl_UpdateLineKedvar。相反,该线程应该使用Tcl_AsyncCreate()等初始化异步事件标记和处理程序,并使用相关函数调用Tcl线程中的异步处理程序,此时处理程序可以安全地调用Tcl_updatelinkdvar()。由于异步处理程序将始终在创建异步事件令牌(您将在调用Tcl_AsyncMark()时使用该令牌)的线程中执行,它将正常工作,因此将保留Tcl所需的线程模型的单元性

我希望我有更多的时间给出一个更完整的答案,但我认为这会让你走上一条富有成效的道路,如果你想一想:在一个线程中更新变量,在C中,对Tcl解释器来说是“异步的”,因此你必须使用异步机制将Tcl变量的更新“移交”给运行你正在使用的Tcl interp的线程

祝你好运


PS:在编写本文时,我正在查看活动状态Tcl 8.5.15.0 for Windows帮助文档。文档非常好,并且大多跨平台适用;我建议您至少将其作为您的一个经常性配套参考。

它不能跨流程工作。或者不同的TCLL接口。当你得到C++代码调用<代码> Tcl?EVALVIEWS/<代码>,运行TCL程序?谢谢@ dAONE,我已经编辑了我的C++代码并添加了TCLYEVALILE文件。当我第一次添加Tcl值文件时,TCL脚本在“主”C++线程中执行,但是C++线程等待TCL脚本完成。所以我把调用TCL脚本的C++代码移到它自己的线程中,这允许同时执行两个线程(这是实现这一点的唯一方法),但是Twitter仍然没有更新……你不应该从不同的线程访问同一个Ip。“./Test.TCL”)阻止,因此C++程序不能执行,直到TCL脚本完成后才改变T值?
#!/home/gc/tcl/bin/tclsh8.6

set tValue ""

puts "I'm also alive"

after 10000

puts "about to puts"

after 1000

puts $tValue

after 10000

puts "about to end"

after 1000

puts "Ended"