从A到B,100张车票,10个窗口售卖,一个窗口一条线程,票卖完之后窗口结束,代码实现QT
时间: 2024-10-14 10:09:17 浏览: 17
Python利用多线程同步锁实现多窗口订票系统(推荐)
在Qt中实现这种场景,你可以创建一个多线程窗口应用,每个窗口代表一个售票窗口。这里是一个简单的示例代码结构:
```cpp
#include <QApplication>
#include <QThread>
#include <QSignalMapper>
class TicketWindow : public QWidget {
public:
explicit TicketWindow(int ticketCount) : ticketCount(ticketCount) {}
private slots:
void sellTicket() {
if (ticketCount > 0) {
emit ticketSold();
ticketCount--;
} else {
close(); // 票卖完后关闭窗口
}
}
signals:
void ticketSold();
private:
int ticketCount;
};
class TicketCounter : public QThread {
public:
TicketCounter(QWidget* parent, int totalTickets) : parent_(parent), totalTickets(totalTickets) {}
protected:
void run() override {
for (int i = 0; i < totalTickets; ++i) {
QApplication::processEvents(); // 更新UI事件循环
parent_->sendTicket();
}
}
private slots:
void sendTicket() {
parent_->ticketSold.emit(); // 触发信号
}
private:
QWidget* parent_;
int totalTickets;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建10个售票窗口
auto windows = new QWidget[10];
for (int i = 0; i < 10; ++i) {
windows[i] = new TicketWindow(10);
// 使用信号映射器连接sellTicket信号和TicketWindow的槽函数
QSignalMapper mapper;
mapper.setMapping(windows[i], i);
connect(&mapper, &QSignalMapper::mapped, this, &TicketCounter::startNewThread);
mapper.map(windows[i]);
windows[i]->show();
}
// 创建计数器线程
TicketCounter counter(windows[0], 100);
counter.start();
return app.exec();
}
```
在这个例子中,`TicketWindow`是窗口类,负责卖票和发送信号。当票售完时,它会触发`ticketSold`信号。`TicketCounter`类继承自`QThread`,在运行时会创建并启动10个子线程,每个线程对应一个窗口。`QSignalMapper`用于将窗口索引映射到对应的卖票操作上。
阅读全文