C++同时运行两个程序-短信逃亡-

C++ run 2 programs at the same time -SMS getaway-

本文关键字:程序 两个 逃亡 运行 C++      更新时间:2023-10-16

我在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倍的短信,因为SELECTUPDATE之间的时间太长。

例如:
程序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,或者简单地将串行端口/调制解调器处理程序定义为一个类,然后将其移动到一个线程。信号槽可用于通信要发送的短信并返回发送结果。

希望这能有所帮助!