Как получить доступ к принятому и закрытому событию QDialogbox - PullRequest
0 голосов
/ 06 августа 2020

у меня есть Qdialogbox, и в этом qdialogbox у меня есть поток (с именем thread3), который выполняет функцию Print_Descendants_key(IUIAutomation* pUIAutomation, IUIAutomationElement* pParent, int indent) в этом потоке3.

поэтому в моем Accepted событии (когда я нажимаю ОК в кнопочном поле) и closeEvent диалогового окна, я хочу выйти / завершить этот поток 3. Как я могу это сделать?

возможно что-то вроде этого ??

void KeyComd::closeEvent(QCloseEvent* event)
{
    std::terminate();
    thread3.terminate(); ??
}

void KeyComd::accepted()
{
    std::terminate();
}

для справки вот мой код QDialog

#include "KeyComd.h"
#include "ui_KeyComd.h"
#include <QtCore>
#include <QtGui>
#include <vector> 
#include<QDebug>
#include "ExecutionContext.h"
#include "XMLParser.h"
#include "Logger.h"
#include "BlockCommand.h"
#include "UIAElementUtils.h"

ExecutionContext exc;
QStringList refreshed_elements;

KeyComd::KeyComd(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    HRESULT hr = exc.init();    
}

KeyComd::~KeyComd()
{
}
void KeyComd::on_showbutton_clicked()
{
    ui.elements_listwidget->clear();
    desktop_elements.clear();

    std::thread thread3(&KeyComd::Print_step, this); // Here it calls a thread, because of this thread ,the execution of "Print_Descendants_key" function happens in a separate thread from main thread
    thread3.detach();
}

void KeyComd::Print_step()
{
    Print_Descendants_key(exc.pUIAutomation, nullptr, 0);
}

void KeyComd::Print_Descendants_key(IUIAutomation* pUIAutomation, IUIAutomationElement* pParent, int indent)
{
    ///Function which appends 1000 list-items in a QListWidget called "elements_listwidget" in my QDialog.
}

1 Ответ

0 голосов
/ 06 августа 2020

Нет хорошего способа принудительно завершить одиночный поток - см. этот ответ SO . Однако то, что вы можете сделать, - это сигнализировать этому потоку о завершении. Вот еще один соответствующий вопрос SO , но также был написан быстрый пример, демонстрирующий технику с помощью atomic_bool:

#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>

std::atomic_bool terminateThreads; // Atomic for setting and reading safely across threads

void runInfinitely() {
    while (!terminateThreads) {
        // Do some work
        std::cout << "Running infinite thread..." << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(150));
    }
    std::cout << "Terminated thread" << std::endl;
}

int main() {
    // Create your thread as you normally would
    std::thread infThread(runInfinitely);

    // Whatever else you like to do...
    std::this_thread::sleep_for(std::chrono::seconds(1));

    // Once you're ready to end it, just set the atomic flag as appropriate
    terminateThreads = true;

    infThread.join(); // Optional in context of this SO question
    std::cout << "End of main" << std::endl;
    return 0;
}

Однако, исходя из этого комментария в KeyComd::Print_Descendants_key, кажется, что функция имеет конечную длину и, таким образом, естественным образом завершит sh + очистку ( соответствующий ответ SO здесь ). Таким образом, если вы в порядке, дождавшись естественного завершения функции потока, вам вообще не требуется «завершать» или очищать поток вручную.

...