2012-01-03 67 views
7

CHỈNH SỬA: Chỉ cần xác nhận xem bạn có thể sao chép điều này hay không sẽ hữu ích. Chỉ cần một máy tính duy nhất để dùng thử (không cần kết nối từ xa).Hiểu giao tiếp giữa hạt nhân và giao diện người dùng - Tại sao giao diện người dùng của tôi bị đóng băng?

Cập nhật Có vẻ như người khác không thể tái tạo điều này trên máy Mac hoặc Win7, vì vậy nó hoặc là WinXP cụ thể hoặc cụ thể cho máy của tôi. Tại thời điểm này tôi từ bỏ.


Sẽ rất hữu ích khi có hướng dẫn về cách Giao diện người dùng và hạt nhân giao tiếp, vì vậy chúng tôi có thể gỡ lỗi các vấn đề hạt nhân từ xa. Bất kỳ câu trả lời chung như vậy (hoặc liên kết đến các hướng dẫn ở nơi khác) được chào đón nhiều nhất. Tôi đã biết về số Remote Kernel Strategies bởi Sascha Kratky.

Bây giờ câu hỏi thực tế: Khi tôi kết nối với máy từ xa bằng bất kỳ cách nào (ví dụ: sử dụng chiến lược hạt nhân từ xa), giao diện người dùng sẽ sớm đóng băng. Làm thế nào tôi có thể ngăn chặn điều này?

Dưới đây là làm thế nào để tạo lại vấn đề trên một máy duy nhất (không có kết nối từ xa cần thiết):

  1. Tạo một cấu hình hạt nhân mới (menu Đánh giá -> Kernel Cấu hình Options ...)

    Chọn Tùy chọn nâng cao.

    luận cứ để MLOpen:

    -LinkName "[email protected],[email protected]" -LinkMode Listen 
    -LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract 
    

    (.. Thay YOUR-IP-HERE với địa chỉ IP của máy tính Trên Windows, bạn có thể có được điều này bằng cách gõ ipconfig trong một cửa sổ lệnh)

    Shell lệnh để khởi động hạt nhân: rời trống (chúng tôi sẽ thực hiện thủ công)

  2. Mở sổ ghi chép mới, đặt hạt nhân của máy tính xách tay thành hạt bạn vừa thiết lập và đánh giá thứ gì đó (1+1).

  3. Bây giờ, chúng tôi cần khởi chạy hạt nhân theo cách thủ công, trước khi kết nối hết giờ. Vì vậy, bắt đầu một hạt nhân mới (math) trong chế độ dòng lệnh, và đánh giá như sau:

    link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *) 
    
    $ParentLink = link; (* set the front end link as parent link *) 
    

    Bây giờ kết nối được thiết lập, và tất cả mọi thứ dường như làm việc một cách chính xác (tiết kiệm cho một thông điệp trong cửa sổ thông báo màu hồng cuối phía trước của)

  4. Đánh giá Manipulate[n, {n, 0, 100, 1}]. Đầu tiên, điều này dường như cũng hoạt động. Bây giờ chơi với thanh trượt. Sớm hay muộn thì giao diện người dùng sẽ đóng băng và cần phải bị giết. Đối với tôi, kéo thanh trượt lên và xuống trong ~ 10 giây mà không phát hành thanh trượt luôn đủ.

Tại sao giao diện người dùng đóng băng? Làm cách nào để tạo kết nối TCPIP-mode giữa giao diện người dùng và hạt nhân theo cách mọi thứ sẽ hoạt động chính xác?


Một số lưu ý:

  • Tôi đang trên Windows XP.
  • Sự cố không bao giờ xuất hiện nếu tôi sử dụng LinkProtocol -> "SharedMemory".
  • Hủy bỏ các phép tính bằng cách sử dụng Đánh giá -> Đánh giá sai sẽ hoạt động chính xác.
  • Tôi đã xác minh bằng cách sử dụng Links[] rằng MathLink`$PreemptiveLinkMathLink`$ServiceLink được tạo và LinkConnectedQ[] trả lại True trên chúng.

Một lần nữa, lưu ý rằng Giao diện người dùng sẽ chỉ đóng băng sau khi kéo thanh trượt Manipualate liên tục trong vài giây mà không giải phóng.

Link to same question on MathGroup.

liên quan: Firewall settings for remote kernel to work (Mathematica)

+0

Đối với người kết thúc: đây là câu hỏi lập trình hợp lệ. Kết nối từ hạt nhân có thể được thiết lập theo lập trình (cho cả giao diện người dùng, hạt nhân khác hoặc phần mềm khác), như tôi đang làm ở đây. Câu hỏi cũng là về sự hiểu biết và sử dụng giao thức truyền thông của Mathematica. – Szabolcs

+0

Chỉ cần hai xu của tôi, khi bạn kéo một phần tử đồ họa mà vòng lặp thông điệp cửa sổ thường được sửa đổi cho đến khi thông báo chuột lên, để phần tử hoặc cửa sổ được kéo xung quanh thật trơn tru. Có thể, điều này gây ra thông điệp đồng bộ giữa các máy tính của bạn bị gián đoạn dẫn đến tình trạng hết thời gian chờ. – Motes

+0

Tôi đã thử điều này trên Windows 7 và không thể tạo lại hang, điều này thật đáng ngạc nhiên vì tôi có thể mong đợi phương pháp này thất bại vì lối vào và hạt nhân duy trì một số liên kết (bên cạnh $ ParentLink): Liên kết dịch vụ và liên kết trống. Tôi tin rằng nếu liên kết trống trước không được thiết lập chính xác, động sẽ không thành công theo cách xấu. –

Trả lời

2

(không phải là một câu trả lời, nhưng khó có thể viết những dòng này như bình luận)

FYI, có một chút thông tin về cách thức đàm phán frontend để hạt nhân ở đây http://reference.wolfram.com/mathematica/tutorial/AdvancedDynamicFunctionality.html

khoảng một nửa chiều xuống, nó cho biết

The front end and kernel communicate with each other through several 
MathLink connections, known as the main link, the preemptive link, 
and the service link. The main and preemptive links are pathways by 
which the front end can send evaluation requests to the kernel, and 
the kernel can respond with results. The service link works in reverse, 
with the kernel sending requests to the front end. 

và hơn thế nữa. Có thể điều đó sẽ giúp ích cho bạn. Ngoài ra, cùng một thông tin là trong file PDF trên trang 31:

http://www.wolfram.com/learningcenter/tutorialcollection/DynamicInteractivity/

Giao thức thông điệp thực sự giữa hạt nhân và kết thúc phía trước cần phải hết sức tiên tiến.

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