如何在C++中向TThread函数传递对象?同步调用报错解决
在C++ Builder的TThread中传递参数给Synchronize调用的解决方法
你遇到的编译错误是因为TThread::Synchronize默认不支持直接传递带参数的成员函数指针。原代码中Synchronize(OutputString(inputString))的写法不符合函数签名要求,编译器找不到匹配的重载。同时要注意:非主线程不能直接访问VCL控件的属性,原代码中读取Form1->Edit1->Text的操作本身就存在线程安全问题,需要一并修正。
方案一:使用线程类成员变量传递参数
- 修改线程类头文件,添加存储字符串的成员变量和无参的内部调用函数:
#ifndef Unit2H #define Unit2H #include <System.Classes.hpp> class TSortThread : public TThread { protected: void __fastcall Execute(); private: System::String FOutputText; void __fastcall OutputStringInternal(); public: __fastcall TSortThread(bool CreateSuspended); void __fastcall UpdateCaption(); }; #endif
- 在cpp文件中实现
OutputStringInternal:
void __fastcall TSortThread::OutputStringInternal() { Form1->Edit2->Text = FOutputText; }
- 更新
Execute方法,安全获取输入字符串并调用同步方法:
void __fastcall TSortThread::Execute() { NameThreadForDebugging(System::String(L"SortingThread")); FreeOnTerminate = true; // 原排序逻辑 for(int i=0;i<50000 - 1;++i) { for(int j=0;j<50000 - 1 - i;++j) { if(Form1->dataField[j] > Form1->dataField[j+1]) { int temp = Form1->dataField[j]; Form1->dataField[j] = Form1->dataField[j+1]; Form1->dataField[j+1] = temp; } } } Synchronize(UpdateCaption); // 安全获取Edit1内容(主线程操作) System::String inputString; Synchronize([&](){ inputString = Form1->Edit1->Text; }); // 传递参数并同步更新Edit2 FOutputText = inputString; Synchronize(&TSortThread::OutputStringInternal); }
方案二:使用C++11 Lambda表达式(更简洁)
利用bcc32c对C++11的支持,直接用lambda捕获变量完成同步操作,无需额外成员函数:
void __fastcall TSortThread::Execute() { NameThreadForDebugging(System::String(L"SortingThread")); FreeOnTerminate = true; // 原排序逻辑 for(int i=0;i<50000 - 1;++i) { for(int j=0;j<50000 - 1 - i;++j) { if(Form1->dataField[j] > Form1->dataField[j+1]) { int temp = Form1->dataField[j]; Form1->dataField[j] = Form1->dataField[j+1]; Form1->dataField[j+1] = temp; } } } Synchronize(UpdateCaption); // 安全获取输入并同步输出 Synchronize([](){ System::String inputString = Form1->Edit1->Text; Form1->Edit2->Text = inputString; }); }
这种方式把获取输入和输出的操作合并在一个Synchronize调用里,代码更紧凑,也避免了线程间的数据共享问题。
内容的提问来源于stack exchange,提问作者Bob Penoyer
相关产品推荐
相关产品推荐

