C++同时运行两个程序-短信逃亡-
C++ run 2 programs at the same time -SMS getaway-
我在Qt上制作了一个C++程序,它执行以下操作:
//CONNECT TO SERIAL 1
//CONNECT TO DATABASE
while(true)
{
query.exec("SELECT id, phone, message FROM USERS WHERE codesend=0 LIMIT 0,1");
if (query.next())
{
int id = query.value(0).toInt();
// Update database: SET "SEND" to 1
query.prepare("UPDATE USERS SET codesend=1 WHERE ID= :nid");
query.bindValue(":nid", id);
query.exec();
//SEND SMS, I DONT DISPLAY IT THATS NOT THE PROBLEM
}
}
这真是太棒了
问题是:
我有很多串行端口可以发送短信,在上面的代码中我只使用了一个
目前我使用其中的两个。我复制并粘贴了这段代码,并运行了两个程序。唯一的区别是它们连接到另一个串行端口。-它们连接到同一个数据库-
使用3个程序连接到3个串行端口时的问题是,有时它会发送2倍的短信,因为SELECT
和UPDATE
之间的时间太长。
例如:
程序1 select
、程序2 select
、程序1 update
。。。太迟了程序2已经选择并且还将发送。。。
我该怎么解决?
快速修复,只有一个程序调用数据库,然后将数据传递给其他程序。
但由于进程间通信困难和同步,这很困难,相反,您可以在一个程序中使用线程。
概念程序
std::mutex mtx;
Data GetSelect() {
std::lock_guard<std::mutex> lck (mtx); // insure mutual exclusive with RAII
query.exec("SELECT id, phone, message FROM USERS WHERE codesend=0 LIMIT 0,1");
if (query.next()) {
int id = query.value(0).toInt();
// Update database: SET "SEND" to 1
query.prepare("UPDATE USERS SET codesend=1 WHERE ID= :nid");
query.bindValue(":nid", id);
query.exec();
... put query in data
return data;
}
return EndToken;
}
// function called by thread
void SendSMS(int SerialPort) {
//CONNECT TO SERIAL SerialPort
auto data = GetSelect();
while(data != EndToken) {
//SEND SMS, I DONT DISPLAY IT THATS NOT THE PROBLEM
data = GetSelect();
}
}
int main() {
//CONNECT TO DATABASE
// make and start threads with different serial ports.
return EXIT_SUCCESS;
}
一个更雄心勃勃的目标可能是为所有查询使用所有调制解调器,这样做的方法是找到一个线程安全的队列,将单个结果/记录放入列表中,并让一些工作线程从列表中消费。
对数据库中的表使用LOCK
。这样,一次只有一个应用程序可以查询数据库,其他应用程序将被阻止,直到它们被允许读取。
mysql> LOCK TABLES USERS WRITE
完成您的工作后(更新后)解锁使用:
mysql> UNLOCK TABLES
我猜,您执行AT命令来发送短信,可能会打开/关闭连接到串行端口的调制解调器。在这种情况下,为什么不从另一个POV解决问题,并使用Surt提出的多线程方法呢?
您可以执行一个程序来管理所有不同的串行端口。线程可以为一次发送而派生,或者(在我看来更好)被编码为主线程的"短信发送服务"。在任何一种情况下,它都是执行选择和更新命令的主线程(只要线程已经发送了分配的短信)。
看看QTConcurrent、QThread和QRunnable,或者简单地将串行端口/调制解调器处理程序定义为一个类,然后将其移动到一个线程。信号槽可用于通信要发送的短信并返回发送结果。
希望这能有所帮助!
- 为什么我的两个 cin 语句没有在程序结束时运行?
- 在 txt 文件中显示前两个数字的程序
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 程序没有问 3 个问题,而是将我对第一个问题的回答用于其他两个问题
- 将两个独立的stdin重定向为程序的输入
- 我的解码程序的两个部分没有按预期工作
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 为什么两个程序中的总和值在最后不同?
- CPP 程序二查找两个给定日期之间的天数,conol CMD
- 比较两个字符串数组,我的控制台应用程序"stops responding"
- 应用程序中的两个不同版本的库
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 如何使 MFC Visual Studio C++ 程序在双处理器设置中使用两个 CPU
- 程序无法识别头文件中的所有函数(除了其中两个)
- 两个内联程序集调用与一个内联程序集调用中的内存损坏?
- 我正在制作一个二十一点程序。我目前有两个问题
- 在两个程序中,传递指向结构的指针的行为不同
- 输入两个数字后程序关闭
- C++中更快地执行两个程序的可能解释(使用 Python 比较)?