首先,我回顾了示例test/threads.cxx;但它并不完全是我要寻找的用例,因为示例线程函数可以访问FLTK函数。
我有一个libssh2库函数(我写了这个函数,但希望它不依赖FLTK),它有以下函数头:
int sshSendFile(const * loclfile,const * scppath,char * bytesuploaded)
我希望它在线程中运行,而在线程中,FLTK旋转并读取值bytesupload,并更新Fl_Progress上的标签,当然,sshSendFile是在上传时更新的。
实际上,这就是我到目前为止所拥有的;一旦sshSendFile完成,我的程序就会以调试结束!
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()上设置断点永远不会被击中。我在调试这个文档和找到不太清楚的文档时遇到了一些麻烦。任何帮助都是非常感谢的!
发布于 2018-07-20 21:22:37
在主线程中调用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,它是复杂的、不可更改的,充其量是不受欢迎的。
https://stackoverflow.com/questions/51450384
复制相似问题