problem z boost::bind

0

Witam.

Mam taki kod klasy, która opakowuje wątki boost i wywołuje w swoim konstruktorze funkcję globalną usbRead widoczną jeszcze niżej:

ThreadEx::ThreadEx(UsbAPI *ptr, int stacksize, int parameter, void * reference, std::string threadName, bool stopFlag) {

	if (!stackSize) {
		stacksize = 4096*10;
	}

	if (stopFlag) { 
		cout << "Thread:" << threadName << "cannot start - stopFlag is 1" << endl;
	} else {
		this->stackSize = stacksize;
		this->parameter = 42;
		boost::thread_attributes attrs;
		attrs.set_stack_size (this->stackSize);
		boost::thread thrd1 (boost::bind(reference, ptr,threadName,stopFlag));
	}
} 
 
void usbRead(UsbAPI* usbObj, std::string threadName, bool stopFlag) {

	cout << "Thread:"<<threadName << "has been started"<< endl;
	while (!stopFlag) {
		//ptr=usbObj->ReadPipe( );
		/*if (!ptr) {
			boundedBuffer->pushNewElements();
		}*/
	}

	cout <<"Thread"<<threadName << "has been stoped"<< endl;
}

czym może być spowodowany błąd ??:

 
1>c:\boost_1_53_0\boost\bind\bind.hpp(69): error C2825: 'F': must be a class or namespace when followed by '::'
1>          c:\boost_1_53_0\boost\bind\bind_template.hpp(15) : see reference to class template instantiation 'boost::_bi::result_traits<R,F>' being compiled
1>          with
1>          [
1>              R=boost::_bi::unspecified,
1>              F=void *
1>          ]
1>          c:\{ścieżka}: see reference to class template instantiation 'boost::_bi::bind_t<R,F,L>' being compiled
1>          with
1>          [
1>              R=boost::_bi::unspecified,
1>              F=void *,
1>              L=boost::_bi::list3<boost::_bi::value<UsbAPI *>,boost::_bi::value<std::string>,boost::_bi::value<bool>>
1>          ]
1>c:\boost_1_53_0\boost\bind\bind.hpp(69): error C2039: 'result_type' : is not a member of '`global namespace''
1>c:\boost_1_53_0\boost\bind\bind.hpp(69): error C2146: syntax error : missing ';' before identifier 'type'
1>c:\boost_1_53_0\boost\bind\bind.hpp(69): error C2208: 'boost::_bi::type' : no members defined using this type
1>c:\boost_1_53_0\boost\bind\bind.hpp(69): fatal error C1903: unable to recover from previous error(s); stopping compilation

Będę wdzięczny za pomoc :)

0

Czym jest w Twoim kodzie?

void * reference

Czytaj dokumentacje: http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html

0

Przekazuję w ten sposób referencje do funkcji, którą potem wywołuję w bind. W dokumentacji jest napisane, że funkcja ta musi być funkcją skłądową jakiejś klasy, ale w necie znalazłem przykład, gdzie wywoływana jest funkcja globalna tak jak u mnie. Nie wiem czemu to nie działa.

0

Dodałem te metody (które były wcześniej globalne) do klasy ThreadEx. Wywołuję tak:

 
boost::thread thrd1 (boost::bind(&ThreadEx::usbRead, &ptr,threadName,stopFlag));

Błąd dalej taki sam. Nie widzę, żeby coś było niezgodne z dokumentacją. :(

0

Rzutowanie wskaźnika na funkcję do void* to undefined behavior

A ja pokażę przykład "cudu":

class Bazowa1 {};
class Bazowa2 {};
class Pochodna:public Bazowa1, public Bazowa2 {};

#include <iostream>
int main()
{
   void* p1;
   void (Bazowa1::*p2)();
   void (Bazowa2::*p3)();
   void (Pochodna::*p4)();
   
   std::cout << sizeof(p1) << std::endl;
   std::cout << sizeof(p2) << std::endl;
   std::cout << sizeof(p3) << std::endl;
   std::cout << sizeof(p4) << std::endl;
}

program wyświetla sizeof() czterech wskaźników: jednego void* oraz trzech wskaźników na funkcję składową.

Co wyświetla GCC 4.7.2?

4
8
8
8

Jak widać, wskaźnik na metodę może mieć inny rozmiar niż wskaźnik na void. Jest to „żywy przykład” gdy takie rzutowanie skończy się źle.

A co wyświetla Visual Studio 2012? (wyniki dla x86):

4
4
4
8

To jest jeszcze ciekawsze: jeden wskaźnik na metodę ma inny rozmiar od drugiego.

0
anthony88 napisał(a):

Dodałem te metody (które były wcześniej globalne) do klasy ThreadEx. Wywołuję tak:

 
boost::thread thrd1 (boost::bind(&ThreadEx::usbRead, &ptr,threadName,stopFlag));

Błąd dalej taki sam. Nie widzę, żeby coś było niezgodne z dokumentacją. :(

Spróbuj:

 boost::thread thrd1 (boost::bind(&ThreadEx::usbRead, this,  &ptr, threadName, stopFlag));
0

Problem rozwiązany. Wywoływana metoda nie była statyczna.
dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1