2009-06-08 34 views
6

Giả sử, tôi cần chạy một loạt mã dễ bị hỏng nên tôi cần chạy nó trên một quy trình khác. Điển hình là tôi muốn làm điều đó như thế này:Cách di động để "fork()" trong ứng dụng Qt4?

pid = fork(); 
    if (pid == -1) { 
    std::cout << "Cant Spawn New Thread"; 
    exit(0); 
    } else if (pid == 0) { 
    std::cout << "Im a child that will crash\n"; 
    char *foo = (char *) 0xffff; 
    std::cout << foo; 
    exit(0); 
    } else { 
    std::cout << "PID: " << pid << "\n"; 
    } 
    do { 
    std::cout << "Waiting for " << pid << " to finish .. \n"; 
    pid_w = waitpid(pid,&status,0); 
    } while (pid_w == -1); 

Rõ ràng là tôi chỉ có thể sử dụng nĩa trong ứng dụng Qt4 của tôi nhưng tôi đang tự hỏi nếu tôi có thể lưu trữ nhiều chức năng giống với bất kỳ điều gì mà Qt4 cung cấp hoặc bất cứ cách nào di động mà không cần đến có bó kiến ​​trúc #ifdefs?

Trong mọi trường hợp, tôi nhắm mục tiêu ứng dụng này chỉ để thực hiện pthread nhưng tôi vẫn muốn giữ mọi thứ gần với API Qt "gốc" nhất có thể.

Tôi đã thử nghiệm QThread và segfaulting trong chuỗi treo toàn bộ ứng dụng rõ ràng và có vẻ như QProcess chỉ được sử dụng khi sinh ra các tệp thực thi hoàn toàn khác nhau. Bất kỳ lựa chọn thay thế nào khác?

+3

Bạn có biết có diễn đàn Qt tại http://qtcentre.org không? Bạn cũng có thể yêu cầu trên #qt kênh trên irc.freenode.net Chỉ trong trường hợp bạn không nhận được câu trả lời của bạn ở đây. –

+0

Tôi đã cố gắng tìm kiếm các ví dụ có thể từ wiki của qtcentre nhưng không tìm thấy bất kỳ thứ gì, tôi sẽ ghé qua ngày #qt sau ngày hôm nay propably =) – rasjani

Trả lời

7

Windows phẳng không có ngã ba() theo bất kỳ cách nào tiêu thụ công khai, do đó, không có lệnh gọi Qt nào để mô phỏng nó; bạn sẽ cần phải làm một cái gì đó như bắt đầu chính mình với các tham số dòng lệnh đặc biệt hoặc một cái gì đó.

+0

Lưu ý rằng có một cách để mô phỏng 'fork()' trên Windows. Cygwin làm điều đó. Tuy nhiên, đó là khá phức tạp và chậm (nó chỉ sao chép toàn bộ bộ nhớ). Vì vậy, cách tốt hơn là có lẽ để di chuyển mã ra một ứng dụng trợ giúp bổ sung mà bạn có thể thực hiện sau đó trong một tiến trình con. Hoặc để bắt đầu ứng dụng tương tự với các tham số dòng lệnh đặc biệt như được đề xuất. – Albert

1

Bạn đã thử thử ... phát biểu khai báo & tìm cách tránh đụng xe ????

+1

Xin lỗi nhưng không phải tùy chọn, mã bị treo * * sẽ bị lỗi nếu muốn và ứng dụng của tôi chỉ cần bắt và chỉ tiếp tục đánh dấu mà không bị rơi. – rasjani

+2

Cố gắng nắm bắt AV và nuốt chúng là một lỗ hổng bảo mật lớn –

3

Tôi nghĩ bạn nên đi với QtConcurrent vì đó là API cấp cao nhất cho lập trình đa luồng có sẵn trong Qt. Bằng cách này, mã của bạn sẽ đơn giản và rõ ràng hơn.
Vì đây là API cấp cao, nên có thể API này đã được triển khai trên các API cấp thấp hơn mà bạn đã thử vì vậy điều này có thể không giải quyết được sự cố của bạn.

0

Bạn cũng có thể thử QThread. Nó là cũ hơn, và có lẽ ít thuận tiện hơn QtConcurrent. Nó không tự động điều chỉnh số lượng lõi trên CPU và do đó không phân phối tải công việc như nhau. Tuy nhiên, nó có lẽ là tương tự Qt gần nhất với fork(), mặc dù nó không phải là một thay thế drop-in, và có thể làm việc tốt hơn cho bạn. Cả hai đều là QThread và QtConcurrent đều có thể di chuyển trên các nền tảng.

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