[Qt-interest] Using Semaphores multiple times in different instances of a class

Jannis Achstetter kripton at kripserver.net
Mon Oct 4 16:42:27 CEST 2010


Am 04.10.2010 16:27, schrieb Sean Harmer:
> Hi,
> 
> On Monday 04 October 2010 15:10:23 Jannis Achstetter wrote:
>> I have an application in C++ that creates multiple instances of a class.
>> Every instance shall have its own circular buffer (used to store audio
>> samples decoded elsewhere in that instance). An instance of another
>> class then calls a function of every decoding-instance to get audio from
>> the instance's circular buffer.
>> As long there is only one audio stream (one instance of the decoding
>> class), everything is fine. As soon as two (ore more) audio streams are
>> working with "their" circular buffer, the data gets corrupted.
>> To manage the circular buffer, I use QSemaphores as shown in the
>> Semaphore Example (Qt Examples -> Threading). Since I do not want them
>> global but per-instance, I tried to "declare" the Semaphores in the
>> classes header-file as "private" variables. This did not work,
>> Semaphores do not behave like normal class instances (the compiler
>> throws an error concerning the numeral value in the braces).
>> So I declared them in the classes source-code. Since the Semaphores are
>> used by several functions of the class, I did not declare them in a
>> function itself but outside any function (making them global obiviosly).
>> When I try to use the scope ("QSemaphore ClassName::SemName(int)"), the
>> compiler throws an error.
>>
>> So my question is: How can I implement a class where every instance has
>> its own copy of two QSemaphores? Or, if not possible: How do I implement
>> a class where every instance has its own circular buffer?
>>
>> If anyone wants to see my source code to better understand my problem I
>> can host it on my server. Two classes + headers were just too much for a
>> mail to a list.
> 
> Sounds like a basic C++ problem to me. You cannot initialise an object in the 
> class declaration - only declare it. You have to initialise it in the the 
> class' constructor. Something like this should do it:
> 
> In the header file:
> 
> #include <QSemaphore>
> 
> class MyClass
> {
> public:
>     MyClass();
> 
>     // Other member functions...
> 
> private:
>     QSemaphore m_sem1;
>     QSemaphore m_sem2;
> };
> 
> In the .cpp file:
> 
> MyClass::MyClass()
>  : m_sem1( 10 ),
>    m_sem2( 0 )
> {
> }
> 
> 
> Does that solve yoru problem?
> 
> Sean

Ok, that sounds good to me. However I realised that the producer and
consumer are in the same thread and I don't actually need Semaphores,
normal variables are okay.
Nevertheless, it's good to know this and you guessed correct: I'm pretty
new to C++, so thanks for pointing this out to me in detail.
Thanks go to Arnold Krille, too who had the same solution.

Jannis



More information about the Qt-interest-old mailing list