2010-03-04 40 views
7

Đây là câu hỏi đầu tiên của tôi về StackOverflow (xin lỗi về tiếng anh của tôi). Tôi sẽ cố gắng giải thích vấn đề cũng như tôi có thể.Vấn đề SWT với syncExec()

Tôi có một ứng dụng swt với một ứng dụng ngọc bích tiền cảnh trong đó tôi có một thanh tiến trình để thông báo thời lượng của ứng dụng. Để làm mới thanh tiến trình này, tôi sử dụng:

if(Display.getCurrent() != null) { 
    progress.run(); 
} 
else { 
    sShell.getDisplay().syncExec(progress); 
} 

Progress là:

Runnable progress = new Runnable() { 
    public void run() { 
     if (progressBar.isDisposed()) 
      return; 
     int percentage= (numStep*100)/maxSteps; 
     progressBar.setSelection(percentage); 
     if (numStep >= maxSteps){ 
      label1.setText("The simulation has been completed."); 
      button.setEnabled(true); 
     }  
    } 
}; 

tôi cố gắng phân tích thời gian mà Runnable này mất và nó là hằng số, nhưng khi tôi phân tích dòng này sSehll.getDisplay().syncExec(progress) mất thời điểm khác nhau (từ 0ms để XXXXms)

tôi đã đọc

syncExec (Runnable Runnable) caus này es thread hiện tại (nếu nó khác với thread giao diện người dùng của màn hình) để chờ cho runnable để kết thúc.

Nhưng Runnable là hằng số thời gian ...

Ai đó có thể hướng dẫn cho tôi? Tôi không hiểu tại sao đôi khi mất 3 phút và một thời gian khác.

Cảm ơn

+1

+1, chào mừng bạn đến với StackOverflow! Tôi đã định dạng lại mã của bạn cho bạn, nhưng không cần phải xin lỗi tiếng Anh của bạn :) –

+0

Cảm ơn bạn. Tôi biết điều này ngồi lâu rồi, nhưng cuối cùng tôi cũng được khuyến khích tham gia. – Michel

Trả lời

1

Theo Display class documentation, syncExec:

Nguyên nhân method run() của Runnable được gọi bởi thread giao diện người dùng tại cơ hội hợp lý tiếp theo . Chủ đề gọi phương thức này bị tạm ngưng cho đến khi chạy xong. Chỉ định null là runnable chỉ cần đánh thức giao diện người dùng chuỗi.

Do đó, phương pháp run của bạn đang chạy trong thời gian không đổi, nhưng đối tượng Display có thể không gọi ngay lập tức.

+0

Tôi nhớ rằng khi tôi đọc tài liệu, nhưng không có cách nào để ép buộc nó? – Michel

+1

Và nếu bạn đã bao giờ nhận được syncExec để mất ba phút sau đó bạn có thể có mã thực hiện trong chủ đề SWT, mà nên được đưa vào một sợi nền. Làm như vậy sẽ cho phép giao diện người dùng chạy mượt mà trở lại. –

3

Có hai phương pháp trong lớp Hiển thị SWT, syncExec và aSyncExec. Cả hai đều được sử dụng khi bạn có một chuỗi không phải là chuỗi giao diện người dùng muốn cập nhật giao diện người dùng theo một cách nào đó. Về cơ bản khi bạn gọi cho họ, bạn về cơ bản là nói đến các chủ đề giao diện người dùng mà bạn có một cái gì đó bạn muốn nó làm khi nó được một cơ hội. Vì vậy, các chủ đề giao diện người dùng sẽ tiếp tục công việc hiện tại của nó và tại một số điểm nó sẽ làm những gì bạn yêu cầu nó làm. Khi nào nó sẽ luôn thay đổi tùy thuộc vào công việc khác mà luồng UI phải làm vào lúc đó.

Sự khác biệt giữa aSyncExec và syncExec là liệu mã có gọi nó chờ cho quá trình thực thi kết thúc hay không. Nếu bạn gọi aSyncExec thì việc thực hiện câu lệnh tiếp theo trong chuỗi gọi của bạn sẽ thực thi ngay lập tức. Nếu bạn gọi syncExec thì chuỗi gọi của bạn sẽ ngồi và chờ cho đến khi Giao diện người dùng thực sự thực thi mã và trả về. Theo thời gian phải mất bao lâu để thực thi syncExec, do đó bạn không cần phải mất bao lâu để chạy, nhưng cũng phải mất bao lâu trước khi thread thread bắt đầu chạy nó.

Đừng bị cám dỗ để hoán đổi syncExec với aSyncExec tại đây.Nếu bạn phải mất bao lâu aSyncExec để thực thi, bạn sẽ thấy nó còn nhanh hơn nữa. Nhưng đó là bởi vì tất cả các bạn là thời gian là phải mất bao lâu để nói cho các chủ đề giao diện người dùng mà bạn có một cái gì đó cho nó để làm (không phải mất bao lâu để làm điều đó).

+0

Nhưng không có cách nào để thực hiện nó ngay lập tức? – Michel

+0

Không. Nó sẽ thực thi khá nhanh chóng, trừ khi giao diện người dùng của bạn đang làm rất nhiều công việc (và nếu đó là trường hợp bạn có thể muốn xem những gì nó đang làm và cố gắng để có được làm việc trong một chủ đề khác nhau). Nếu nó thực sự mất 3 phút sau đó tôi đoán thread UI của bạn đang làm cái gì khác? Nó có liên quan đến giao diện người dùng mà nó đang làm không? – DaveJohnston

+0

Có, nó có liên quan ... – Michel