Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6133343
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T17:12:57+00:00 2026-05-23T17:12:57+00:00

I have tried to create a concurrent queue class, in a producer-consumer pattern. I

  • 0

I have tried to create a concurrent queue class, in a producer-consumer pattern.

I based the class off http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

In my main thread, I called the following two methods using Qt::Concurrent

QFutureWatcher<void> *loadwatcher;
loadwatcher = new QFutureWatcher<void>();
QString filename("myfile");
QFuture<void> future = QtConcurrent::run(this, &EraserBatch::loadTiles,filename);
loadwatcher->setFuture(future);


QFutureWatcher<bool> *procwatcher;
procwatcher = new QFutureWatcher<bool>();
QFuture<bool> procfuture = QtConcurrent::run(this, &EraserBatch::processTile);
procwatcher->setFuture(procfuture);

so loadTiles is my producer, and processTile is my consumer.

in loadtiles, I have a loop that is loading the tiles like so:

for(int i =0; i < nXBlocks; i++)
{
    for(int j = 0; j < nYBlocks; j++)
    {
        Tile *ipi = new Tile(filename);
        sleep(1);
        qDebug()<<"Tile pushed to queue:"<<i<<" "<<j << " Thread id:"<<this->thread();
        this->tiles->push(ipi);
    }
}

and in the consumer method, i have the following:

Tile *tile;
this->tiles->wait_and_pop(tile);

while(!tiles->empty())
{
            qDebug()<<"Tile popped from queue:"<<tile->tilePosX<<" "<<tile->tilePosY<< " Thread id: " << this->thread();
            sleep(5);
             tiles->wait_and_pop(tile);
   }

This seems to push all of the tiles to the queue, however it seems like my consumer never makes it into the while loop, because i pop the first tile, and then the queue is empty.

So this is a design flaw – but I guess I need to know how to tell the producer to wait for all tiles to be added to the queue, and keep waiting until all of them are done. I need to pop the first tile outside the while loop to get some setup info for variables that will be used in the loop, and to allocate some memory and suhc, that i dont want to do over and over. Whats the best way to set this up?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T17:12:57+00:00Added an answer on May 23, 2026 at 5:12 pm

    In a scenario like this the producer needs to tell the consumer that no more data will be coming. Typically this is achieved by having something like a Close() method on the queue. Your consumer test would then become:

    while (!tiles->empty() || !tiles->closed())
    {
       ... blocking consume
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have tried to find how to create DLL-s on linux using google, but
I have tried <ul id=contact_list> <li id=phone>Local 604-555-5555</li> <li id=i18l_phone>Toll-Free 1-800-555-5555</li> </ul> with #contact_list
I have tried this... Dim myMatches As String() = System.Text.RegularExpressions.Regex.Split(postRow.Item(Post), \b\#\b) But it is
I have tried what seems like everything - I've done similiar things many times
I have tried the following two statements: SELECT col FROM db.tbl WHERE col (LIKE
I have tried to integrate the Picasa API on iPhone, compiles fine, but I
I have tried different examples to filter a gridview by dropdownlist, but is it
I have tried to use ASP.NET MVC for a while, then I face a
I have tried SQL Server 2008 Management Studio and other third party tools to
I have tried to use some of the widgets in JQuery UI on an

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.