webForumDet fria alternativet

Trådar osv med C++ under Win XP

7 svar · 399 visningar · startad av mangan

manganMedlem sedan feb. 2003216 inlägg
#1

Hej!

Tänkte skriva ett program som måste jobba med trådar som gör lite olika grejer under win xp. Nu undrar jag om ngn har ngra tips på läsning i ämnet eller kanske tom. vet om ngt bibliotek som är bra. Ett stort plus om det även täcker in mutex, semaforer och liknande.

Har hittat denna boken och den verkar bra:

http://www.adlibris.se/shop/product.asp?isbn=0321256190&mscssid=A5T3R6LU7P289HNWET3W3GHFR71E0Q01

ngn som läst?

Tack på förhand

Sang-draxMedlem sedan juli 2002581 inlägg
#2

boost är väldigt bra att använda för trådhantering i C++

manganMedlem sedan feb. 2003216 inlägg
#3

Ok, nu har jag tagit ner biblioteket och har lite svårt att bygga det. Använder Dev-C++ och alltså MingW för att kompilera men det verkar inte vara det lättaste att få det att funka. Som jag fattar det ska man bara köra build.bat för att få fram sin Bjam executible men då måste man väl ha MingW i sin PATH vilket jag inte har. Jag har inte heller rättigheter att ändra i min path för jag sitter inte som admin på detta systemet.

Finns det ngt sätt att säga till build.bat var MingW ligger?

manganMedlem sedan feb. 2003216 inlägg
#4

Hej igen!

Gav upp med att försöka bygga Boost. Hittade efter lite letande ett klart DevPak som verkar vara bra.
http://devpaks.org/show.php?devpak=94
Nu är bara problemet att jag inte lyckas få kompileringen i Dev-C++ att funka.
Lyckas få den att hitta alla include-filer i testprogrammet men det blir ngt annat fel:

#include <boost/thread/thread.hpp>
#include <boost/thread/once.hpp>
#include <cassert>

int value=0;
boost::once_flag once = BOOST_ONCE_INIT;

void init()
{
    ++value;
}

void thread_proc()
{
    boost::call_once(&init, once);
}

int main(int argc, char* argv[])
{
    boost::thread_group threads;
    for (int i=0; i<5; ++i)
        threads.create_thread(&thread_proc);
    threads.join_all();
    assert(value == 1);
}

------- Start fel --------------------------
Compiler: Default compiler
Building Makefile: "C:\mina_program\projekt\Makefile.win"
Executing make...
make.exe -f "C:\mina_program\projekt\Makefile.win" all
g++.exe test1/once3.o -o "test1\thread_test1.exe" -L"C:/mina_program/Dev-Cpp/lib"

test1/once3.o(.text+0x122):once3.cpp: undefined reference to `_imp___ZN5boost9call_onceEPFvvERl'
test1/once3.o(.text+0x193):once3.cpp: undefined reference to `_imp___ZN5boost12thread_groupC1Ev'
test1/once3.o(.text+0x1e1):once3.cpp: undefined reference to `_imp___ZN5boost12thread_group13create_threadERKNS_9function0IvSaINS_13function_baseEEEE'
test1/once3.o(.text+0x257):once3.cpp: undefined reference to `_imp___ZN5boost12thread_group8join_allEv'

test1/once3.o(.text+0x29c):once3.cpp: undefined reference to `_imp___ZN5boost12thread_groupD1Ev'
test1/once3.o(.text+0x2d1):once3.cpp: undefined reference to `_imp___ZN5boost12thread_groupD1Ev'
collect2: ld returned 1 exit status

make.exe: *** [test1/thread_test1.exe] Error 1

Execution terminated
---------------------------------------

Sang-draxMedlem sedan juli 2002581 inlägg
#5

Du kan ladda hem en kompilerad version av bjam för Windows. Det gjorde jag när jag skulle installera boost (för MSVC++ dock, så jag kan inte hjälpa dig med kompilatorspecifika detaljer).

För er andra: bjam är ett program som installerar och kompilerar boost.

manganMedlem sedan feb. 2003216 inlägg
#6

Hittade det själv sen. Nu har jag lyckats kompilera allt och det funkade fint. Men nu kan jag inte få ens det enklaste testprogrammet att kompilera. Först hade jag problem med headers men det löste jag genom att flytta dom till "include" mappen. Dock kvarstår att jag får en massa "undefined reference" fel när jag kompilerar. Detta måste ju bero på att kompilatorn inte hittar de bibliotek som behövs för att kompilera. Dock har jag inte löst/fattat hur man får det att funka.

Om det är ngn som kan Dev-C++ bra och har erfarenhet av Boost så kan ni ju höra av er. Övriga förslag är också välkomna.

manganMedlem sedan feb. 2003216 inlägg
#7

HURRA!

Nu har jag fått ett helloworld att funka iaf. Använde mig av en av .dll-filerna istället och det funkade klockrent med en gång.

Samtliga steg:

1. Ta ner boost-paketet, packa upp
http://sourceforge.net/project/showfiles.php?group_id=7586

2. Ta ner bjam.exe från sourceforge
http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941

3. Öppna ett kommandofönster och ställ dig i boost mappen. Kompilera dll:er osv genom att köra

bjam "-sTOOLS=mingw" stage

Viktigt! Detta gäller för mingw och ingen annan kompilator. Se även till att ha kompilatorn i din PATH.

Resterande är Dev-C++ specifikt

4. Kopiera hela katalogen med katalogerna med HPP-filerna (boost_1_32_0/boost) till Dev-C++ include-katalog. Nu kommer du kunna använda dom genom att skriva tex

#include <boost/threads/threads.hpp>

.

5. När du använder något från boost så skickar du bara med platsen var dll-filen ligger till länkaren. (Project Options/Parameters/Linker). Man kommer behöva kopiera dll-filerna man använder till programmappen för att kunna köra men det märker man ;) .

Tror det var allt :D

Sang-draxMedlem sedan juli 2002581 inlägg
#8

Nån borde sätta sig och förkompilera boost till vanliga kombinationer av platform/kompilator till en enda fil med ett trevligt installationsprogram.

Den filen skulle bli ganska stor dock. Boost består väl av en fil på cirka 8-9 MB när man laddar hem det, men installerat tar det upp 801 MB för mig.

135 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)