首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FLTK中的线程化

FLTK中的线程化
EN

Stack Overflow用户
提问于 2018-07-20 21:06:53
回答 1查看 295关注 0票数 1

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

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

int sshSendFile(const * loclfile,const * scppath,char * bytesuploaded)

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

实际上,这就是我到目前为止所拥有的;一旦sshSendFile完成,我的程序就会以调试结束!

代码语言:javascript
运行
复制
            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()上设置断点永远不会被击中。我在调试这个文档和找到不太清楚的文档时遇到了一些麻烦。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 21:22:37

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

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

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

代码语言:javascript
运行
复制
struct Task {
    std::string file;
    ...
}

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

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

代码语言:javascript
运行
复制
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,它是复杂的、不可更改的,充其量是不受欢迎的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51450384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档