Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка при запуске VCL приложения с Boost.Thread

49K
18 декабря 2010 года
S0mbre
16 / / 15.10.2009
Пытаюсь запустить VCL приложение, тестирующее многопоточность на базе boost::thread. Компилируется нормально, но при запуске выскакивает ошибка памяти (открывается окно ЦПУ). При нажатиях в дебаггере "step over (F8)" в конце концов открывается окно Access Violation - ошибка чтения памяти.

Ниже привожу код.

В заголовочном файле:
Код:
#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;
};


В основной форме код запуска потока такой:
 
Код:
CThreadClass wObj(Memo1);
boost::thread workerThread(wObj);
workerThread.join();


Код взят (и слегка дополнен) из примера. В чем может быть ошибка?
11
18 декабря 2010 года
oxotnik333
2.9K / / 03.08.2007
уж скока раз твердили миру... нельзя напрямую рулить ГУЯми из дочернего потока, надо из него посылать пользовательское сообщение с нужными параметрами, а в главном (гуевом) потоке его обрабатывать.
49K
19 декабря 2010 года
S0mbre
16 / / 15.10.2009
Да ведь и без GUI та же ошибка-то выходит - вот что самое интересное!
Т.е. даже если сделать
Код:
#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); // пауза полсекунды
        }
    }
};


-- и то не работает!
49K
19 декабря 2010 года
S0mbre
16 / / 15.10.2009
Вообще никакой вариант создания потока с boost::thread у меня не запускается, даже самый простой (передача адреса функции в конструктор). Каждый раз ошибка на одном и том же месте:

Цитата:

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

49K
19 декабря 2010 года
S0mbre
16 / / 15.10.2009
Проверил простейший вариант в консольном приложении - тоже та же ошибка!

Код:
#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;
}
49K
19 декабря 2010 года
S0mbre
16 / / 15.10.2009
В общем, как я понял, boost::thread плохо "уживается" с Билдером, по крайней мере, 2010 версии. Придется переходить на родные CreateThread / VCL TThread...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог