FLTK 中的线程

Posted

技术标签:

【中文标题】FLTK 中的线程【英文标题】:Threading in FLTK 【发布时间】:2018-07-20 21:06:53 【问题描述】:

首先,我回顾了示例test/threads.cxx;但这并不是我正在寻找的用例,因为示例线程函数可以访问 FLTK 函数。

我有一个 libssh2 库函数(我写的,但希望它不依赖于 FLTK),具有以下函数头:

int sshSendFile(const char * loclfile, const char * scppath, char * 字节上传)

我希望它在线程中运行,在线程中,FLTK 旋转并读取值 bytesupload 并更新 Fl_Progress 上的标签,当然 sshSendFile 在上传时会更新。

实际上,这就是我目前所拥有的;一旦 sshSendFile 完成,我的程序就会在 Debug 中退出!

            Fl::lock();

            char * string_target;

            string_target = (char *)malloc(128);

            void * next_message;

            (Fl_Thread)_beginthread((void(__cdecl *)(void *))sshSendFile("C:/randomfile.txt", "/tmp/testing, string_target), 0,NULL);

            while (Fl::wait() > 0) 
                if ((next_message = Fl::thread_message()) != NULL) 
                    this->progress_bar->label(string_target);
                    this->redraw();
                    Fl::check();
                
            

            Fl::unlock();

Fl:wait() 处设置断点永远不会被命中。我在调试这个时遇到了一些麻烦,并且发现文档不太清楚。任何帮助表示赞赏!

【问题讨论】:

你做这一切的方式非常错误。 _beginthread 需要函数的地址,但您正在传递一些不相关的值,该值被转换为指向函数的指针。这将导致访问冲突错误,之后将无济于事。 C 风格转换是引入错误的好方法。 【参考方案1】:

您在主线程中调用sshSendFile,然后尝试使用此函数的结果启动线程。

请注意,_beginthread 接受指向函数的指针,并且您必须使用从 int(void(__cdecl *)(void *)) 的这种丑陋的转换“静默”错误。

换句话说,您必须将函数指针作为第一个参数传递给_beginthread,最简单的方法是像这样创建“主线程”:

struct Task 
    std::string file;
    ...


void sendFiles(void* arg) 
      Task* task = (task*)arg;
      sshSendFiles(task.file.c_str(), ...); 
      delete task;

你的启动线程代码应该传递sendFiles 和一个任务指针:

task* task = new task();
task->file = "something";
... initialize also buffer
(Fl_Thread)_beginthread(&sendFiles, 0, task);
   // this will call startThread(task) in main thread

另一方面,使用 C++11 中的现代线程 API 会容易得多,因为您现在所做的是简单的旧系统级 C,它很复杂、不方便且充其量已被弃用。

【讨论】:

以上是关于FLTK 中的线程的主要内容,如果未能解决你的问题,请参考以下文章

FLTK 事件映射/多线程

xCode math.h 中的 FLTK 错误

opengl 中的透明度(使用 FLTK)

纯 C++ 中的多线程?

fltk 1.3 库中的 graph.h 在哪里?

使用c ++删除发送到FLTK中线程的数据