Bonjour,

Je vous explique mon petit problème

J'ai une liste contenant une grande quantité de messages:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
std::deque<ProviderMessage*> pending_;
Et j'ai une classe Logic avec une méthode processMessages() qui se simplifie en:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void Logic::processMessages()
{
  // Connect the addQuote signal to the addQuote slot to update GUI
  QObject::connect( this,    SIGNAL( addQuote(const timestamp_t&, const price_t&, const quantity_t&, const price_t&, const quantity_t&) ),
                    quotes_, SLOT  ( addQuote(const timestamp_t&, const price_t&, const quantity_t&, const price_t&, const quantity_t&) ) );
  // Connect the addTrade signal to the addTrade slot to update GUI
  QObject::connect( this,    SIGNAL( addTrade(const timestamp_t&, const price_t&, const quantity_t&) ),
                    trades_, SLOT  ( addTrade(const timestamp_t&, const price_t&, const quantity_t&) ) );
  // Connect the progress signal to the logicProgress slot to update the progress bar
  QObject::connect( this,        SIGNAL( progress     (datetime_t) ),
                    simulation_, SLOT  ( logicProgress(datetime_t) ) );
 
  // For each pending message
  std::deque<ProviderMessage*>::iterator it = pendingMessages_.begin();
  for (; it!=pendingMessages_.end(); ++it )
  {
    // Emit message to update GUI
    switch ( (*it)->type() )
    {
      case ProviderMessage::QUOTE:
      {
        const QuoteItem* quote = static_cast<const QuoteMessage*>(*it)->quote();
        // Update GUI
        emit addQuote( quote->timestamp(),
                       quote->bidPrice(), quote->bidQuantity(),
                       quote->askPrice(), quote->askQuantity() );
        // Update progress
        emit progress( quote->timestamp() );
        break;
      }
      case ProviderMessage::TRADE:
      {
        const TradeItem* trade = static_cast<const TradeMessage*>(*it)->trade();
        // Update GUI
        emit addTrade( trade->timestamp(), trade->price(), trade->quantity() );
        // Update progress
        emit progress( trade->timestamp() );
        break;
      }
    }
  }
  pendingMessages_.clear();
}
Le signal progress(datetime_t) est connecté à un slot logicProgress qui met à jour une barre de progression.
Les signaux addX() sont connectés à des modèles (des dérivés de QAbstractListModel) pour ajouter l'item et les visualiser dans des vues.

Cette méthode processMessages() est lancée dans un thread séparé du principal.

Si je commente les émissions de signaux d'update de la GUI ( addX() ) tout se passe bien: la barre de progression est mise-à-jour fréquemment.
Mais lorsque ces signaux sont envoyés, c'est comme si tous mes signaux de progress étaient relayés la fin de la pile des signaux. La barre de progression n'avance plus, jusqu'à ce que processMessage finisse et la *boum* ma barre de progression saute à 100%.

Je me doute que je n'ai pas du respecter/comprendre quelquechose avec les signaux
Ils sont pourtant bien sensés être ordonnés par ordre d'envoi ?