c++ - FLTK 中的线程
问题描述
首先,我回顾了这个例子test/threads.cxx
;但这并不完全是我正在寻找的用例,因为示例线程函数可以访问 FLTK 函数。
我有一个libssh2
库函数(我写的,但希望它不依赖于 FLTK),具有以下函数头:
int sshSendFile(const char * loclfile, const char * scppath, char * bytesuploaded)
我希望它在线程中运行,并且在线程中,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()
永远不会被击中。我在调试这个时遇到了一些麻烦,并且发现文档不太清楚。任何帮助表示赞赏!
解决方案
您在主线程中调用sshSendFile
,然后尝试使用此函数的结果启动线程。
请注意,_beginthread
接受指向函数的指针,并且您必须使用这种丑陋的 from int
to强制“沉默”错误(void(__cdecl *)(void *))
。
换句话说,您必须将函数指针作为第一个参数传递给_beginthread
,最简单的方法是像这样创建“thread main”:
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,它很复杂、不方便且充其量已被弃用。
推荐阅读
- css - SCSS:如何不在 CSS 文件中重复声明?
- jquery - 物化 CSS 导航栏菜单下拉菜单不会低于原点
- android - OnBindViewHolder (RecyclerView) - java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
- javascript - 如何根据 Javascript 中的变量值生成动态页面?
- r - 从具有多个统计测试结果列表的列表中提取统计值
- elasticsearch - Elasticsearch 为每条记录匹配一个查询中的所有其他记录?
- javascript - Axios 拦截器重试原始请求并访问原始承诺
- c# - C# 向文本文件写入一行给出 System.Char[]
- visual-studio - 加载程序集时出现异常:无法加载程序集“Microsoft.Data.Sqlite”
- php - 如何从 WordPress 数据库中删除大量帖子