mysql - 在 perl/tk 上使用线程来避免窗口卡住/不响应

标签 mysql perl user-interface tk-toolkit

我正在尝试在我的 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 不是线程安全的。

  1. 在创建任何 Tk 小部件之前创建线程。
  2. 不要接触线程中的任何 Tk 对象,使用共享变量进行通信。

关于mysql - 在 perl/tk 上使用线程来避免窗口卡住/不响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759117/

相关文章:

regex - perl - 将字符串拆分为 2 个字符的组

python - PyQT相当于wx CallAfter?

javascript - 我可以从 reactJS 中的渲染条件函数更改我的 css 样式属性吗?

mysql - 为什么这对 mysql 复制不安全

MYSQL - 连接 2 个表,左表上有完整的行

sql - 你如何找出MySQL数据库中数据的总大小?

perl - 如何在 Perl 中从 printf 呈现未定义的值?

java - java中SQL表中概率的随机项

android - 如何使用 Perl 脚本测试使用 Eclipse Epic 的 Android 应用程序?

JavaFX - 如何关闭 ToggleButton 的自动 setSelected(bool) 功能?