2010-07-15 34 views
5

Trong ứng dụng Qt GUI của tôi, tôi kêu gọi các lệnh nhắc qua:Lời nhắc lệnh gọi từ ứng dụng Qt mà không bị đóng băng?

system("lots.exe & of.exe && commands.exe"); 

Nó mở ra cửa sổ lệnh (như tôi muốn nó), nhưng đóng băng các ứng dụng Qt GUI cho đến khi tôi đóng cửa sổ lệnh. Có cách nào để ngăn chặn điều này? Tôi thấy rằng có một lớp QProcess, nhưng không thể làm cho nó đưa ra dấu nhắc lệnh.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

Công việc "&&" có hoạt động không? Tôi hy vọng nó sẽ không hoạt động, vì đó phải là cú pháp của shell (cmd.exe, bash, vv) và QProcess không xử lý điều đó. EDIT: ngu ngốc tôi, đây vẫn là hệ thống() ... –

Trả lời

7

QProcess thực sự là câu trả lời. Nếu bạn muốn sử dụng một cái gì đó như system(), bạn sẽ phải thực hiện cuộc gọi trong một chuỗi khác hoặc sử dụng popen hoặc thứ gì đó tương tự cho nền tảng của bạn.

QProcess không có setReadChannel mà bạn có thể sử dụng để hiển thị cửa sổ bảng điều khiển của riêng mình để hiển thị đầu ra.

1

Bạn chỉ cần đặt cuộc gọi hệ thống đó trong một chuỗi riêng biệt.

+2

Không cần phải làm điều đó khi QProcess có sẵn. Cũng sẽ không có cách nào tốt để làm gián đoạn luồng trong khi nó bị chặn trong hệ thống(), điều này có thể gây ra các vấn đề nếu exe bên dưới không thoát ra trong một thời gian dài (hoặc bao giờ) –

+0

Đó là vấn đề chung với hệ thống (), Tôi đồng ý :) –

1

Nếu bạn không cần bất kỳ đầu ra nào, cách dễ nhất là sử dụng QProcess :: startDetached().

http://doc.qt.io/archives/4.6/qprocess.html#startDetached

Nếu bạn cần đầu ra, QtConcurrent :: chạy với một futurewatcher chứa đầu ra sẽ ít overhead/công việc hơn bắt nguồn QThread.

Các vấn đề liên quan