2009-11-22 1 views
0

Actuellement, j'ai des problèmes avec QTimer. J'essaie de faire en sorte que chaque "Produit" ait une minuterie et ainsi il sera possible à mon "Handler" de savoir que le temps d'enchères du produit est terminé. Le problème que j'ai, c'est que de mon test, il ne semble pas imprimer "Timer a commencé".Utilisation de QTimer & Select. J'ai besoin d'obtenir le temps de vente aux enchères

Cela fait partie de mon projet de programmation de socket. J'utilise select parce que je n'ai pas encore appris le multithreading. Donc, si quelqu'un peut me donner des conseils. My HandleTCPClient est appelée depuis mon serveur lorsqu'un client envoie un message. Merci d'avance.

Product.cpp

#include <string> 
using std::string; 
#include <iostream> 
using std::cout; 


#include "Product.h" 

Product::Product() 
{ 
seller = ""; 
itemName = ""; 
price = 0.00; 
min = 0.00; 
buyingPrice = 0.00; 
time = 0; 
description = ""; 
highestBidder = "None"; 
currentBid = 0.00; 

timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(setProductToSold())); 
} 

void Product::startTimer() 
{ 
cout << " Timer Started " << endl;     <<< When called this isn't printed 
    timer->start(2000, TRUE); // 2 seconds single-shot timer 

} 

void Product::setHandler(Handler *h) 
{ 
handler = h; 
} 

void Product::setProductToSold() 
{ 
cout << " Item auction over" << endl; 
} 

De mon HandleTCPClient:

... 
vector <Account> account; 
vector <Product *> product; 
... 

product = checkUser(product,&tempProduct,clntSocket); // check to see if the user is logged in, else can't sell product 
output = checkUserSell(clntSocket); // generate a string to see if user is logged in or not 

tempProduct.startTimer(); 

// Start the Timer!!! 

Où:

// Push product onto products list 
vector <Product *> checkUser(vector <Product *> products, Product * temp, int clntSocket) // generate a new product: check to see if user is logged in or not (2) sell product 
{ 
for (int i=0; i<account.size(); i++) 
{ 
    if (account[i].socket == clntSocket) // user is logged in! 
    { 
    temp->seller = account[i].name; 
    products.push_back(temp); 
    break; 
    } 
} 

return products; 
} 

et ...

string checkUserSell(int clntSocket) // generate a string: check to see if user is logged in or not (2) sell product 
{ 
string output = "2\n<You must first log in if you would like to sell your products>\n<<<TRANSACTION CANCELLED>>>\n"; 

for (int i=0; i<account.size(); i++) 
{ 
    if (account[i].socket == clntSocket) // user is logged in! 
    { 
    output = "1\n<Your product has been put up for Auction>\n"; 
    break; 
    } 
} 

return output; 
} 

======================================== =============================================

Répondre

2

Gardez à l'esprit que l'événement de Qt loop est single threaded: Si vous bloquez dans select() dans le thread principal, la boucle d'événements de Qt ne peut pas s'exécuter tant que select() n'est pas retourné, et aucun événement QTimer en attente ne sera exécuté. Solutions possibles: au lieu de bloquer dans select(), utilisez la classe Qtocket de Qt (etc) pour implémenter votre réseau (de sorte que le multiplexage d'événements réseau soit intégré dans la boucle d'événements Qt) ... ou exécutez votre boucle d'événement select() un thread distinct du thread de la boucle d'événement Qt. La première solution est plus simple.