我正在尝试在我的 perl/tk 应用程序中使用线程,以便它在连接到远程 mysql 服务器时不会卡住。
#!/usr/bin/perl
use warnings;
use strict;
use DBI;
use DBD::mysql;
use Tk;
use threads;
use threads::shared;
our $type="mysql";
our $database="b_db";
our $host="mysite.com";
our $port="3306";
our $tablename="tc";
our $user="example";
our $pwd="********";
our $dsn="dbi:$type:$database:$host:$port";
my $thr=threads->create(\&con);
our $mw=new MainWindow;
$mw->Button(-text=>"Connect",-command=>\&con)->pack;
MainLoop;
sub con{
our $connect=DBI->connect($dsn,$user,$pwd)or die &mysql_Err;
print "done connecting\n" if $connect;
print "error\n" unless $connect;
}
$thr->detach;
但它在尝试连接时仍然卡住。我试过使用 tk/fileevent:
#!/usr/bin/perl
use DBI;
use DBD::mysql;
use Tk;
our $type="mysql";
our $database="b_db";
our $host="mysite.com";
our $port="3306";
our $tablename="tc";
our $user="example";
our $pwd="********";
our $dsn="dbi:$type:$database:$host:$port";
our $mw=new MainWindow;
$mw->Button(-text=>"Connect",-command=>\&con)->pack;
sub con{
our $connect=DBI->connect($dsn,$user,$pwd)or die &mysql_Err;
$mw->fileevent($connect, "readable", \&contquery);
}
sub contquery{
$query="SELECT * FROM products ORDER BY id";
$queryhandle=$connect->prepare($query);
$queryhandle->execute;
$queryhandle->bind_columns(undef, \$product_id, \$price, \$product_name, \product_type);
while($queryhandle->fetch()){
print <<print;
Product Name: $product_name | Type: $product_type | Prict: $price
print
}
}
MainLoop;
但它仍然卡住。谁能告诉我这可能是什么原因?
最佳答案
参见 PerlMonks : Tk 不是线程安全的。
- 在创建任何 Tk 小部件之前创建线程。
- 不要接触线程中的任何 Tk 对象,使用共享变量进行通信。
关于mysql - 在 perl/tk 上使用线程来避免窗口卡住/不响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759117/