Невозможно уснуть буст-нить - PullRequest
0 голосов
/ 09 марта 2012

ОС: Win7
IDE: Visual Studio 2010
Boost Версия: 1.47

Я новичок в Boost, и то, что я пытаюсь сделать, очень просто.Я создал один поток в заголовочном файле и попытался перевести его в режим сна.Но я не могу заставить его работать.Вот код и ошибки компиляции

main.h -

#pragma once   
#include <conio.h>   
#include <boost\thread.hpp>   

boost::posix_time::seconds workTime ( 120 );  
boost::this_thread::sleep ( workTime );  

main.cpp

#include "main.h"  

void main ( void ) {
    _getch();
};

Вывод -

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2365: 'boost::this_thread::sleep' : redefinition; previous definition was 'function'
error C2491: 'boost::this_thread::sleep' : definition of dllimport data not allowed
error C2482: 'boost::this_thread::sleep' : dynamic initialization of 'thread' data not allowed

Использованиеследующий код, все в main.cpp:

#include <boost\thread.hpp>
#include <conio.h> 

void thread_func()
{
    boost::posix_time::seconds workTime ( 120 );
    boost::this_thread::sleep ( workTime );
}

int main(int argc, char* argv[])
{
    boost::thread t(thread_func);
    _getch();
}

Получение следующих ошибок:

1> LIBCMTD.lib (dbgheap.obj): ошибка LNK2005: __heap_alloc уже определен в LIBCMT.lib (malloc.obj)
1> LIBCMTD.lib (dbgheap.obj): ошибка LNK2005: __recalloc уже определен в LIBCMT.lib (recalloc.obj)
1> LIBCMTD.lib (dbgheap.obj):ошибка LNK2005: __msize уже определен в LIBCMT.lib (msize.obj)
1> LIBCMTD.lib (dbghook.obj): ошибка LNK2005: __crt_debugger_hook уже определен в LIBCMT.lib (dbghookMobjobjobjobj)>.lib (isctype.obj): ошибка LNK2005: __isctype_l уже определен в LIBCMT.lib (isctype.obj)
1> LIBCMTD.lib (isctype.obj): ошибка LNK2005: __isctype уже определен в LIBCMTli.obj)
1> LINK: предупреждение LNK4098: defaultlib 'LIBCMTD' конфликтует с использованием других библиотек;используйте / NODEFAULTLIB: библиотека
1> фатальная ошибка LNK1169: найден один или несколько кратно определенных символов

1 Ответ

1 голос
/ 09 марта 2012

Вы звоните boost::this_thread::sleep ( workTime ) вне какого-либо потока управления.Вы должны сделать что-то вроде:

void thread_func()
{
    boost::posix_time::seconds workTime ( 120 );
    boost::this_thread::sleep ( workTime );
}

int main(int argc, char* argv[])
{
    boost::thread t(thread_func);
    _getch();
}
...