使用wxperl我希望在将文件拖到窗口后启动一个持久的功能。这是我的DropTarget代码:
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使用删除的文件作为参数调用函数& runner()。)
一切都很好,除了Windows上的拖动源窗口被阻止,而function& runner()正在工作,这可能是一个持久的操作。在OnDropFiles
返回1之后,拖动源窗口再次变得可用,因此在& runner()准备好之后。
是否有机会在& runner()完成之前取消阻止拖动源?
答案 0 :(得分:-1)
不要立即调用该函数,而是推迟执行此操作直到下一个事件循环迭代。如果3.x CallAfter()被wxPerl包装,您应该使用它。如果没有,请使用通常的wxEVT_IDLE
技巧手动模拟它:为此事件设置一个处理程序,检查一个标志并调用你的函数(如果已设置(并重置))并在OnDropFiles()
中设置此标志