#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
...
class TForm1 : public TForm
{
...
};
class CThreadClass // класс (функтор) треда
{
public:
CThreadClass(TMemo *M) : Memo(M)
{
}
~CThreadClass()
{
}
void operator()() // вызываемая функция
{
int iteration;
boost::posix_time::milliseconds ms(500);
while (iteration < 20)
{
Memo->Lines->Add(IntToStr(++iteration) + " итерация...");
boost::this_thread::sleep(ms); // пауза полсекунды
}
}
private:
// volatile bool m_stoprequested;
TMemo *Memo;
};
Ошибка при запуске VCL приложения с Boost.Thread
Ниже привожу код.
В заголовочном файле:
Код:
В основной форме код запуска потока такой:
Код:
CThreadClass wObj(Memo1);
boost::thread workerThread(wObj);
workerThread.join();
boost::thread workerThread(wObj);
workerThread.join();
Код взят (и слегка дополнен) из примера. В чем может быть ошибка?
уж скока раз твердили миру... нельзя напрямую рулить ГУЯми из дочернего потока, надо из него посылать пользовательское сообщение с нужными параметрами, а в главном (гуевом) потоке его обрабатывать.
Т.е. даже если сделать
Код:
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
...
class TForm1 : public TForm
{
...
};
class CThreadClass // класс (функтор) треда
{
public:
CThreadClass()
{
}
~CThreadClass()
{
}
void operator()() // вызываемая функция
{
int iteration;
boost::posix_time::milliseconds ms(500);
while (iteration < 20)
{
boost::this_thread::sleep(ms); // пауза полсекунды
}
}
};
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
...
class TForm1 : public TForm
{
...
};
class CThreadClass // класс (функтор) треда
{
public:
CThreadClass()
{
}
~CThreadClass()
{
}
void operator()() // вызываемая функция
{
int iteration;
boost::posix_time::milliseconds ms(500);
while (iteration < 20)
{
boost::this_thread::sleep(ms); // пауза полсекунды
}
}
};
-- и то не работает!
Цитата:
004013D5 44 inc esp
004013D6 40 inc eax
004013D7 0000 add [eax],al
004013D9 1E push ds
004013DA 46 inc esi
004013DB 43 inc ebx
004013DC 40 inc eax
004013DD 0000 add [eax],al
004013DF 1E push ds
004013E0 5C pop esp
004013E1 1D4000001E sbb eax,$1e000040
004013E6 EC in al,dx
004013E7 324000 xor al,[eax+$00]
004013EA 0000 add [eax],al
004013EC 0000 add [eax],al
004013EE 0000 add [eax],al
004013F0 EB10 jmp $00401402 <== вот тут ошибка
004013F2 66623A bound di,[edx]
004013F5 43 inc ebx
004013F6 2B2B sub ebp,[ebx]
004013F8 48 dec eax
004013F9 4F dec edi
004013FA 4F dec edi
004013FB 4B dec ebx
004013FC 90 nop
004013FD E9AC504000 jmp $008064ae
00401402 A19F504000 mov eax,[$0040509f]
00401407 C1E002 shl eax,$02
0040140A A3A3504000 mov [$004050a3],eax
0040140F 52 push edx
00401410 6A00 push $00
Код:
#pragma hdrstop
#include <tchar.h>
#include <iostream.h>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
//#include <boost/bind.hpp>
//---------------------------------------------------------------------------
#pragma argsused
void workerFunc()
{
boost::posix_time::seconds workTime(3);
cout << "Worker: running" << endl;
// Pretend to do something useful...
boost::this_thread::sleep(workTime);
cout << "Worker: finished" << endl;
}
//---------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
cout << "main: startup" << endl;
boost::thread workerThread(workerFunc);
cout << "main: waiting for thread" << endl;
workerThread.join();
cout << "main: done" << endl;
return 0;
}
#include <tchar.h>
#include <iostream.h>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
//#include <boost/bind.hpp>
//---------------------------------------------------------------------------
#pragma argsused
void workerFunc()
{
boost::posix_time::seconds workTime(3);
cout << "Worker: running" << endl;
// Pretend to do something useful...
boost::this_thread::sleep(workTime);
cout << "Worker: finished" << endl;
}
//---------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
cout << "main: startup" << endl;
boost::thread workerThread(workerFunc);
cout << "main: waiting for thread" << endl;
workerThread.join();
cout << "main: done" << endl;
return 0;
}
В общем, как я понял, boost::thread плохо "уживается" с Билдером, по крайней мере, 2010 версии. Придется переходить на родные CreateThread / VCL TThread...