2012-04-03 35 views
13

kiện về MATLAB:Responsive GUI MATLAB mà không gọi drawnow() trực tiếp

  1. MATLAB UI là Java Swing.
  2. MATLAB có khả năng tương tác tuyệt vời với Java, có thể khởi tạo các đối tượng Java và gọi phương thức của chúng trực tiếp từ mã MATLAB, thậm chí có thể truyền trong MATLAB người nghe đã định nghĩa Java!

Vấn đề của tôi:

MATLAB không cung cấp đề nền, vì vậy để làm cho MATLAB UI đáp ứng chúng ta phải gọi hàm drawnow mà xả Swing EDT hàng đợi, xem thêm herehere. Đây là một thực tế được biết đến, cho đến nay rất tốt.

Nhưng bây giờ tôi có một khách hàng có mã thực hiện tính toán là một tệp p MATLAB (được mã hóa) vì vậy tôi không có quyền truy cập vào mã để đặt drawnow tại đó.

nỗ lực không thành công:

tôi đã cố gắng quay lên một bộ đếm thời gian để làm công việc gọi drawnow nhưng nó dường như không làm việc - hẹn giờ chính nó cần một tiền lệ drawnow bắn callbacks của nó.

EDIT: Cuối cùng tôi đã triển khai GUI với .NET/WPF đang chạy trên một chuỗi khác, vì vậy nó luôn đáp ứng và trông đẹp hơn nhiều so với MATLAB gốc.

Trả lời

2

Chỉ là một ý tưởng. Bạn có thể xây dựng một tệp jar từ tệp p bằng cách sử dụng trình xây dựng Matlab cho java. Từ bên trong Java, bạn có thể thực hiện phép tính ngay bây giờ trong một chuỗi riêng biệt.

+0

Đó là một giải pháp rất xấu nhưng có thể hoạt động. ** Tôi phải kiểm tra nó trước khi tôi có thể đánh giá nó **. – Mikhail

7

Tôi không biết liệu điều này có thể được thực hiện đúng cách hay không. Tôi chưa bao giờ tìm thấy một cách để có được hiệu ứng của drawow ở giữa một tập tin mex, và tôi sẽ đoán tình trạng này là tương tự. Nhưng đây là một hack vô cùng lộn xộn anyway: D. Nếu bạn có tệp p, bạn có thể chạy:

profile on; 
pfile(); 
profile viewer; 

và nhận ý tưởng về hàm pfile() đang gọi. Nếu mã đang gọi bất kỳ hàm dựng sẵn nào (ví dụ: disp) hoặc bất kỳ hàm nào có mã nguồn mà bạn có quyền truy cập, bạn có thể tạo phiên bản tệp của riêng mình tiếp tục lên đường dẫn, tệp này sẽ được gọi bằng tệp p, ví dụ

function disp(X) 
    if (toc > 5) 
    drawnow; 
    tic; 
    end 
    builtin('disp', X); 

Điều này sẽ được gọi nhiều nhất 5 giây một lần, mặc dù sẽ không được sử dụng nhiều nếu không được phân phối thường xuyên. Nếu bạn không thể tìm thấy nội dung được ghi đè, bạn có thể sử dụng bất kỳ chức năng nào khác và chỉ cần chèn phần rút gọn ở trên cùng, như:

function primes(N) 
    if (toc > 5) 
    drawnow; 
    tic; 
    end 
    The rest of the original primes.m here. 
+0

Rất thông minh! Điều gì về khả năng hiển thị/ưu tiên khi tôi ghi đè (a) hàm dựng sẵn như hàm 'disp' (b) do người dùng định nghĩa như' số nguyên tố', có thể là chính mã p? – Mikhail

+1

Nó khá lộn xộn. Tôi nghĩ rằng luôn luôn có một cách để cụ thể tham khảo một chức năng (ngay cả khi nó đã được ghi đè), nhưng tôi không thể tìm thấy nó ngay bây giờ. Như tôi đã hiểu, 'path' xác định chính xác các hàm nào có thể nhìn thấy được. Bất kỳ hàm overriden nào khác dường như không thể truy cập được, ngoại trừ các hàm dựng sẵn, trong đó 'builtin (...)' cho phép bạn truy cập chúng.Tôi không nghĩ rằng p-coded-ness ảnh hưởng đến khả năng hiển thị/ưu tiên: nếu có một hàm có cùng tên tiếp tục lên con đường thì nó sẽ được ưu tiên. – Richante

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