2014-03-12 42 views
0

使用wxperl我想在將文件拖到我的窗口後啓動持久功能。這裏是我的DropTarget的代碼:OnDropFiles啓動持久功能

package FilesDropTarget; 

use strict; 
use Wx qw[:allclasses]; 
use base qw(Wx::FileDropTarget); 

sub new { 
    my $class = shift; 
    my $caller = shift; 
    my $fref = shift; 
    my $this = $class->SUPER::new(@_); 
    $this->{caller} = $caller; 
    $this->{fref} = $fref; 
    return $this; 
} 

sub OnDropFiles { 
    my($this, $x, $y, $files) = @_; 

    &{$this->{fref}}($this->{caller},@$files); 

    return 1; 
} 

該模塊通過

$frame->{TextControl}->SetDropTarget(FilesDropTarget->new($frame,\&runner)); 

(OnDropFiles調用函數&亞軍()與被丟棄的文件作爲參數) 一切使用的很好,除了Windows的拖動源窗口被阻塞,而功能& runner()正在工作,這可能是一個持久的操作。拖動源窗口在OnDropFiles返回1後變爲可用,因此在& runner()準備就緒後。

runor()完成之前是否有機會讓拖動源暢通無阻?

回答

-1

不要立即調用該函數,而是推遲這樣做直到下一個事件循環迭代。如果3.x CallAfter()被wxPerl包裝,則應該使用它。如果沒有,請使用通常的wxEVT_IDLE技巧手動模擬它:爲此事件設置一個處理程序,檢查一個標誌並在設置後調用您的函數(並重置它),並在您的OnDropFiles()中設置此標誌。

+0

非常感謝您指點正確的方向! – leu