//========== processtree.hclass ProcessTree : public QThread{ Q_OBJECTpublic: void setTree(QTreeWidget *i);protected: QTreeWidget *tree; void run();private: bool checkPing(const QString *str);};//======== processtree.cppvoid ProcessTree::run(){ QTreeWidgetItemIterator iterator(tree, QTreeWidgetItemIterator::All); MyShell *test = new MyShell; test->start(*iterator);} void ProcessTree::setTree(QTreeWidget *item, MyShell *p){ tree = item;}
//=========== Hclass MyShell : public QProcess {Q_OBJECTsignals: void pFinished(bool result);public: MyShell(QWidget *pwgt = 0); void start(QTreeWidgetItem *i);public slots: void slotDataOnStdout();private slots: void finalize(bool result);private: QProcess *m_process; QTreeWidgetItem *item;};//============= CPPMyShell::MyShell(QWidget *pwgt) : QProcess(pwgt){ item = 0; m_process = new QProcess(this); connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(slotDataOnStdout())); connect(this, SIGNAL(pFinished(bool)), SLOT(finalize(bool)));} void MyShell::start(QTreeWidgetItem *i){ item = i; item->setText(1, "Started"); m_process->start("cmd /C ping "+item->text(0));} void MyShell::slotDataOnStdout(){ item->setText(1, "inSTD"); //Это просто проверка, получен ли сигнал QString *output = new QString(m_process->readAllStandardOutput()); if(output->indexOf("TTL") < 0) emit finished(false); else emit pFinished(true);/*Здесь ещё раньше ставил m_process->kill(), т.к. пингуется ли айпи можно понять по первой строчке вывда, а ждать, если не пингуется, пока выведет все "Превышен ..." не хочется. Расчитывал убивать процесс, а потом, в цикле в потоке, запускать его снова. Не знаю уж, нормально это или быдлокод, с потоками и процессами первый раз столкнулся. Посоветуете, может, что-нибудь? */} void MyShell::finalize(bool result){ if(result) item->setText(0, "OWNED!!!"); //Опять проверка else item->setText(0, "FAIL :(");}
QObject: Cannot create children for a parent that is in a different thread.(Parent is QProcess(0xa7bd18), parent's thread is QThread(0x3e9270), current thread is ProcessTree(0x12fec8)QObject: Cannot create children for a parent that is in a different thread.(Parent is QProcess(0xa7bd18), parent's thread is QThread(0x3e9270), current thread is ProcessTree(0x12fec8)
m_process->start("cmd /C ping "+item->text(0));
void ProcessTree::run(){ /* -//-//-//- */ QTreeWidgetItemIterator iterator(tree, QTreeWidgetItemIterator::All); process->start(*iterator); // А вот тут, после выполнения 1 функции start, поток умирает, если не вызвать к примеру QThread::run();}
MyShell *test = new MyShell; QTreeWidgetItemIterator iterator(tree, QTreeWidgetItemIterator::All); test->start(*iterator);
process->start(*iterator);
sleep(2);
void ProcessTree::run(){ MyShell *test = new MyShell; // <- Это разве не динамически создаётся? QTreeWidgetItemIterator iterator(tree, QTreeWidgetItemIterator::All); test->start(*iterator); /* Ну а здесь проверка на завершился ли процесс будет, а сейчас хоть бы для одного элемента заставить работать его. */}
void ProcessTree::run(){ MyShell *test = new MyShell; // <- Это разве не динамически создаётся? QTreeWidgetItemIterator iterator(tree, QTreeWidgetItemIterator::All); test->start(*iterator); /* Ну а здесь проверка на завершился ли процесс будет, а сейчас хоть бы для одного элемента заставить работать его. */ QThread::run();}
while(true){}