#ifndef MARKOVTHREAD_H#define MARKOVTHREAD_H#include <QThread>#include <QString>#include <QStringList>class markovThread : public QThread { Q_OBJECT public: QString codeText; QString inputStr; markovThread(); void run(); signals: void messageGot(QString); void resultGot(QString); private: int checkSyntax(QString line); int interp(QString line, QString &str);};#endif // MARKOVTHREAD_H
#include "markovthread.h"markovThread::markovThread(){ codeText = "";}void markovThread::run(){ if (codeText=="") { emit messageGot("No code found"); return; } if (inputStr=="") { emit messageGot("No input string specified"); return; } codeText.replace("\r",""); QStringList commands = codeText.split("\n", QString::SkipEmptyParts); int i, j; // Проверка синтаксиса каждой из строк bool allright=true; for (int i=0; i<commands.size(); i++) { j=checkSyntax(commands.at(i)); if (j==2) { emit messageGot("Line " + QString("%1").arg(i+1) + ": No replace operator"); allright=false; } else if (j==3) { emit messageGot("Line " + QString("%1").arg(i+1) + ": Two or more replace operators"); allright=false; } } // Если имеются ошибки, дальшейшее исполнение невозможно if (!allright) { return; } // Непосредственное выполнение программы j=0; i=0; while (true) { j=interp(commands.at(i),inputStr); if ( j==0) { if (i<commands.size()-1) { i++; } else { emit messageGot("End with no finishing operator"); break; } } else if(j==1) { emit resultGot(inputStr); i=0; } else if(j=2) { emit messageGot("End with finishing operator"); break; } }}int markovThread::checkSyntax(QString line){ // Если строка пустая, то ее синтаксис верено if (line=="") { return 1; } // Если строка начинается с обозначения комментария, ее синтаксис верен if (line.left(2)=="//") { return 1; } //Проверка расположения оператора замены // Если оператор в строке не найден - ошибка if (line.indexOf("->")==-1) { return 2; } // Если в строке более одного оператора замены, строка не верна if (line.lastIndexOf("->") != line.indexOf("->")) { return 3; } // Дальнейших проверок не требуется, строка синтаксически верна return 0;}// Функция интерпретирования языка.// 0 - следующая строка// 1 - программа заново// 2 - остановка программыint markovThread::interp(QString line, QString &str){ // Находим пустую строку или комментарий, переходим на следующую строку if (line=="") { return 0; } if (line.left(2)=="//") { return 0; } QString s1,s2; int p=-1; // Поиск завершающего оператора p = line.indexOf("->."); if (p>-1) { s1=line.mid(0,p); s2=line.mid(p+3); // Первый операнд пустой/не пустой if (s1=="") { str = s2+str; return 2; } else { p = str.indexOf(s1); if (p>-1) { str.replace(s1,s2); return 2; } else { return 0; } } } // Поиск исполняемого оператора p = line.indexOf("->"); if (p>-1) { s1=line.mid(0,p); s2=line.mid(p+2); if (s1=="") { str=s2+str; return 1; } else { p=str.indexOf(s1); if (p>-1) { str.replace(s1,s2); return 1; } else { return 0; } } } return 0;}
void MainWindow::btnStart_Clicked(){ edtExec->setText(""); lstMessages->clear(); btnStart->setEnabled(false); btnStop->setEnabled(true); mThread->codeText="a->b"; mThread->inputStr="aaabbb"; mThread->start();}void MainWindow::btnStop_Clicked(){ mThread->quit();}
mThread->terminate();
else if(j=2)
C++ (Qt)void markovThread::exitThread(){ if (!isRunning()) return; m_stopMutex.lock(); m_stopped = true; m_stopMutex.unlock(); wait();} void markovThread::run(){ m_stopMutex.lock(); m_stopped = false; m_stopMutex.unlock(); ... while (!stopped) { .... }} void MainWindow::btnStop_Clicked(){ mThread->exitThread();}
mThread = new markovThread(); connect(mThread, SIGNAL(messageGot(QString)),this, SLOT(mThread_messageGot(QString))); connect(mThread, SIGNAL(resultGot(QString)),this, SLOT(mThread_resultGot(QString))); connect(mThread, SIGNAL(finished()),this, SLOT(mThread_finished()));
connect(mThread, SIGNAL(messageGot(QString)),this, SLOT(mThread_messageGot(QString)), Qt::QueuedConnection); connect(mThread, SIGNAL(resultGot(QString)),this, SLOT(mThread_resultGot(QString)), Qt::QueuedConnection); connect(mThread, SIGNAL(finished()),this, SLOT(mThread_finished()), Qt::QueuedConnection);
C++ (Qt)void markovThread::run(){ ... while (<>) { .... if (<>) { //do something } else if (<>) { // do something else } else { //do nothing msleep(10); } }}