QtC++代码,主窗口用定时器处理一个事件,用线程进行文件拷贝,不影响定时器处理事件的示例程序
时间: 2024-12-02 10:20:35 浏览: 22
在Qt C++中,你可以创建一个这样的程序结构,其中主窗口(MainWindow)使用QTimer定期处理事件,而文件拷贝操作则在一个独立的QThread中运行。这有助于保持GUI的响应性和避免阻塞主线程。以下是一个简单的示例:
```cpp
#include <QApplication>
#include <QWidget>
#include <QTimer>
#include <QThread>
#include <QFileSystemWatcher>
#include <QFile>
class FileCopyTask : public QObject
{
public slots:
void copyFiles(const QString &source, const QString &destination)
{
QFile file(source);
if (file.open(QIODevice::ReadOnly))
{
QFile dest(destination);
if (!dest.open(QIODevice::WriteOnly | QIODevice::Truncate))
qDebug() << "Failed to open destination file";
else
{
file.copy(dest);
file.close();
dest.close();
}
} else
qDebug() << "Failed to open source file";
}
private:
Q_DISABLE_COPY(FileCopyTask)
};
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent), timer_(this)
{
fileSystemWatcher_.addPaths(QStringLiteral("/path/to/watch")); // 指定需要监视的文件夹路径
connect(&timer_, & QTimer::timeout, this, &MainWindow::handleEvent);
startTimer();
}
private slots:
void handleEvent()
{
// 主窗口的定时事件处理逻辑...
}
void startTimer()
{
timer_.start(1000); // 设置定时器间隔1秒
}
private:
QTimer timer_;
QFileSystemWatcher fileSystemWatcher_;
FileCopyTask fileCopyTask_; // 创建一个线程任务实例
void onFileChanged(const QString &fileName)
{
if (!thread_->isRunning()) // 如果线程未启动,则开始复制
{
thread_->start();
fileCopyTask_.copyFiles(fileName, "/path/to/destination"); // 调用线程的任务函数
}
}
private:
QThread thread_; // 线程对象
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
```
在这个例子中,`FileCopyTask`类负责在子线程中进行文件拷贝,并通过信号槽机制与主线程通信。当指定的文件系统发生变化时(如新文件生成),`onFileChanged`方法会被触发,这时如果线程还未启动,会启动线程并开始拷贝。
注意,实际应用中,你需要确保线程安全地访问共享资源,比如在`copyFiles`中添加合适的锁或其他同步机制。
阅读全文