如何关闭运行中的excel.exe delphi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何关闭运行中的excel.exe delphi相关的知识,希望对你有一定的参考价值。

我写了一些数据要导入到excel里面,但在这之前我要判断有没有excel程序在运行,如果有怎么关掉它。

参考技术A 杀进程。

KillTask ('excel.exe');

下面是这个函数。

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;
参考技术B 用这句就可以了:WinExec('ntsd -c q -pn excel.exe',0)本回答被提问者采纳

从qt中的另一个线程运行qtconcurrent时如何关闭程序

【中文标题】从qt中的另一个线程运行qtconcurrent时如何关闭程序【英文标题】:How to close the programme when running a qtconcurrent from another thread in qt 【发布时间】:2019-11-27 15:58:35 【问题描述】:

我正在运行一个具有多线程的程序。该程序首先有一个主/ UI线程在其中运行。在这个程序中,我有一个工人和处理程序类。

worker 类有一个简单的生成随机数的模拟函数。模拟函数连续生成数字而不阻塞任何线程,即通过 Qtconcurrent。

我已从主/UI 线程将此工作类放入新线程。 handler类运行在主/UI线程,负责通过信号槽与运行在其他线程的worker类进行通信。

到目前为止一切正常。

当我尝试通过简单地单击应用程序十字按钮来关闭程序时,问题就开始了。 该 程序有点挂起它不会关闭。但是,当我不将工作者放在另一个类中并从同一个主 /UI 线程运行工作者类时,就没有问题,程序以 0 退出。

所以我的问题是如何停止 Qtconcurrent 是另一个线程并最终关闭另一个线程

谢谢。

main.cpp

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    QThread l_newThread;

    Worker* l_worker = new Worker();
    handler * l_handler = new handler();

    l_worker->moveToThread(&l_newThread);

    QObject::connect(&l_newThread, &QThread::started, l_worker, &Worker::Init);

    QObject::connect(l_handler,&handler::toStop_Signal,&l_newThread, &QThread::quit);
    QObject::connect(l_worker, &Worker::toStop_Signal_Worker, l_handler,&handler::toStop_Slot);
    QObject::connect(&app,&QCoreApplication::aboutToQuit, l_worker, &Worker::stop);
   // QObject::connect(&app,&QCoreApplication::aboutToQuit, &l_newThread, &QThread::quit);

    l_newThread.start();
   // l_worker->Init();

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    int result = app.exec();

    l_newThread.wait();

    return result;

worker.cpp

#include "worker.h"

Worker::Worker(QObject *parent) : QObject(parent)




void Worker:: Init()

    m_simulation = true;
    simulate();


void Worker::simulate()

    QtConcurrent::run([this]
        QRandomGenerator generator;

        while (m_simulation) 


            qint32 t = generator.bounded(0,100);
            qDebug() << t;


            qDebug() << "sleeping for 1 second";
            QThread::sleep(1);
        

        if (!m_simulation) 
            qDebug() << "Killing the concurrent thread";
            //  QThread::currentThread()->exit();
            emit toStop_Signal_Worker();
        
    );



void Worker::stop()

    m_simulation = false;

handler.cpp

#include "handler.h"

handler::handler(QObject *parent) : QObject(parent)




void handler::toStop_Slot()

    emit toStop_Signal();

结果

QML debugging is enabled. Only use this in a safe environment.
19
sleeping for 1 second
55
sleeping for 1 second
70
sleeping for 1 second
69
sleeping for 1 second
Killing the concurrent thread

【问题讨论】:

【参考方案1】:

这里可能会发生什么:用于退出l_newThread 的信号toStop_Signal 永远不会传递,因为当它发出时,事件循环已经死了并且消失了。因此,您的程序卡在等待l_newThread.wait(); 中的线程。

我完全不明白你为什么要启动这个线程,只是为了在之后使用QtConcurrent::run 并跨越另一个线程......

无论如何,一旦您确定您的工作人员已停止(根据您发布的输出,您已经停止),您可以直接在 main 中安全地退出(基本上无用的)线程:

int result = app.exec();

l_newThread.exit(); //just quit it
l_newThread.wait();

return result;

那么你就可以摆脱这个连接了:

QObject::connect(l_handler,&handler::toStop_Signal,&l_newThread, &QThread::quit);

和(我猜)完全是处理程序。

【讨论】:

谢谢,这次我试过了,它没有停止QtConcurrent,因为它一直在运行。如何确保第一个 qt 并发停止,然后另一个线程停止/退出。

以上是关于如何关闭运行中的excel.exe delphi的主要内容,如果未能解决你的问题,请参考以下文章

delphi程序关闭,进程依然存在

使用 c sharp 在点网环境中运行本机 Delphi 代码 [关闭]

DELPHI中如何使窗体的关闭按钮失效

delphi 请问:如何点了窗口右上解的关闭,程序不是关闭而且隐藏?

Delphi 中的单元测试——你是怎么做的? [关闭]

在服务器上杀死 Excel.EXE [重复]