如何在 gtk 中将小部件作为不同的线程加载? (瓦拉)

2024-03-18

我创建了这个类,出于效率原因,我想将缩略图作为不同的线程加载到图标视图中,因为如果我在同一个线程中执行此操作,GUI 加载速度会非常慢。但是当我创建线程时,它不起作用,它绘制了一些缩略图,然后它们就消失了。当我使用 join 时,它有效。这是我的代码:

    public class FotoThumbnailPane : Gtk.ScrolledWindow{

private FotoThumbnailPane_i pane;   
private string namet;

public FotoThumbnailPane(string name){
    this.namet = name;
}

public void set_imagelist(fileutils.ImageList image_list){
    pane = new FotoThumbnailPane_i(image_list);
    this.add (pane);
    this.set_min_content_width(140);
    this.show_all();
}

    //This is my threaded function
    public void* load_thumbs(){

    pane.set_visible(false);
    pane.newmodel = new Gtk.ListStore (2, typeof (Gdk.Pixbuf), typeof (string));
    pane.set_selection_mode (Gtk.SelectionMode.SINGLE);
    pane.set_pixbuf_column (0);
    pane.set_model(pane.newmodel);

    string icon_style = """
            .thumbnail-view {
                background-color: #FFFFFF;
            }
            .thumbnail-view:selected {
                background-color: #9D9D9D;
                border-color: shade (mix (rgb (34, 255, 120), #fff, 0.5), 0.9);
            }
        """;

    var icon_view_style = new Gtk.CssProvider ();

        try {
            icon_view_style.load_from_data (icon_style, -1);
        } catch (Error e) {
            warning (e.message);
        }
        pane.get_style_context ().add_class ("thumbnail-view");
    pane.get_style_context ().add_provider (icon_view_style, Gtk.STYLE_PROVIDER_PRIORITY_THEME);

    //Add thumbnails to the iconview
    string buff;
    for(int i=1; i<pane.image_list.size; i++){
    buff = pane.image_list.get_full_filename(i);
    stdout.printf("Added %s to thumbnail\n", buff);
            var image = new Gdk.Pixbuf.from_file_at_scale(buff, 110, 80, false);
            // Add the wallpaper name and thumbnail to the IconView
            Gtk.TreeIter root;
            pane.newmodel.append(out root);
            pane.newmodel.set(root, 0, image, -1);
            pane.newmodel.set(root, 1, pane.image_list.get_filename(i), -1);

            // Select the thumbnail if it is the first in list
            if (i==0) {
                pane.select_path (pane.newmodel.get_path (root));
            }    
            pane.iters.append (root);
    }
    pane.set_sensitive(true);
    this.queue_draw();
return null;
}

}


您实际上不需要处理程序中的线程——您只需使用异步方法 https://live.gnome.org/Vala/Tutorial#Asynchronous_Methods加载内容。具体来说,Gdk.Pixbuf.new_from_stream_at_scale_async http://valadoc.org/gdk-pixbuf-2.0/Gdk.Pixbuf.new_from_stream_at_scale_async.html.

这是一个例子:

public async void load (Gtk.Image img, string filename) {
  GLib.File file = GLib.File.new_for_commandline_arg (filename);
  try {
    GLib.InputStream stream = yield file.read_async ();
    Gdk.Pixbuf pixbuf = yield Gdk.Pixbuf.new_from_stream_at_scale_async (stream, 320, -1, true);
    img.set_from_pixbuf (pixbuf);
  } catch ( GLib.Error e ) {
    GLib.error (e.message);
  }
}

private static int main (string[] args) {
  GLib.return_val_if_fail (args.length > 1, -1);

  Gtk.init (ref args);

  Gtk.Window win = new Gtk.Window ();
  win.destroy.connect (() => {
      Gtk.main_quit ();
    });

  Gtk.Image image = new Gtk.Image ();
  win.add (image);

  load.begin (image, args[1], (obj, async_res) => {
      GLib.debug ("Finished loading.");
    });

  win.show_all ();

  Gtk.main ();

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 gtk 中将小部件作为不同的线程加载? (瓦拉) 的相关文章

  • ConcurrentHashMap.computeIfAbsent 和 ConcurrentHashMap.computeIfPresent 中 `mappingFunction` 的执行

    我正在尝试查看实际的 Java 文档 描述了多少次的行为mappingFunction可以在传递给时调用ConcurrentHashMap computeIfAbsent and ConcurrentHashMap computeIfPre
  • Objective-C中如何使用后台线程?

    我试图在按下按钮时运行 while 循环 但无法按下按钮 因为 while 循环会阻塞 UI 是否有一个后台线程 我可以在其中运行 while 循环并推送UIButton 就个人而言 我会在 UI 顶部运行 HUD 活动指示器 然后在后台运
  • 在 .NET 4.0 中将任务与 Parallel.Foreach 一起使用

    我开始尝试向 Windows 窗体添加一个进度条 以更新 Parallel Foreach 循环中运行的代码的进度 为此 UI 线程必须可用于更新进度条 我使用 Task 来运行 Parallel Foreach 循环 以允许 UI 线程更
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 使用 .Net HttpListener 进行多线程

    我有一个听众 listener new HttpListener listener Prefixes Add http 8077 listener Start listenerThread new Thread HandleRequests
  • 设置一个值来指示线程已完成安全吗?

    我想将一个耗时的进程委托给我的 C 程序中的一个单独的线程 使用 boost 库 我编写了如下代码 thrd new boost thread boost bind myclass mymethod this finished flag W
  • C++并行std::sort用于浮点值

    我有一个包含数百万个浮点值的大文件 我可以使用轻松对它们进行排序std sort通过将文件读入vector现在 例如 std vector
  • 无法从 run 方法中访问对象的属性(方法)! Java多线程

    我在 ServerConnectionManager 中有以下代码 public class ServerConnectionManager implements Runnable private DatagramPacket receiv
  • 为什么将 volatile 与同步块一起使用?

    我在java中看到了一些示例 其中他们在代码块上进行同步以更改某些变量 而该变量最初被声明为易失性 我在单例类的示例中看到 他们将唯一实例声明为易失性 并且同步了该块初始化该实例 我的问题是为什么我们在同步它时声明它是易失性的 为什么我们需
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来
  • C# 中的线程和 GUI 元素

    我正在尝试制作一个基本的 IRC 客户端 但我的问题是让文本显示在 RTF 框中而不出现滞后 我决定使用线程 并且我想更新线程中的 RTF 框 但我不能 因为它给了我关于 RTF 框元素不是静态的错误 有什么见解吗 如果你们想要的话我会粘贴
  • 线程安全的异步字节队列

    我有一个回调方法 只要有新数据可用 就会调用该方法 public delegate void DataCallback byte buffer int offset int count 我想将其包装在一个实现与此类似的接口的类中 publi
  • SLURM 节点、任务、核心和 CPU

    有人能够澄清这些东西到底是什么吗 据我所知 节点是集群内的计算点 本质上是一台计算机 任务是可以在单个节点或多个节点上执行的进程 核心基本上是指您希望在单个节点上分配多少 CPU 来执行分配给该 CPU 的任务 它是否正确 我混淆了什么吗
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 使用 Thread.Sleep 等待的替代方法

    首先我不是在问同样的问题C Thread Sleep 的替代方案 https stackoverflow com questions 5450353 c sharp alternative to thread sleep or C 中 Th
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 进度条没有进展

    我有一个正在更新 sqlserver 中的表的程序 我有一个表单 我想显示其进度 进度条正在递增 但没有显示 我需要为此使用后台工作者吗 我正在做什么的例子 public void updateTable string tableName
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安

随机推荐

  • 选择时列名无效

    我有一张桌子叫Jobs具有以下列名称 JobID Name and Value 该表就像只有一个条目一样被填满 JobID 1 Name 测试工作 Value 10 我想要做select from Jobs where Name TestJ
  • Visual Basic 6 ListView 的自动化支持

    I need to get value text of control via automation interface coding with C C I tried with UI Automation API https msdn m
  • 是什么让GDB拒绝崩溃?

    我在这里不知所措 我正在用 C 编写一个编译器 出于爱好 并使用 GDB 7 3 在 amd64 Linux 2 6 32 上使用 GCC 4 6 1 进行编译 除了通常的 I 等之外 标志还有 Wall Wextra O0 g 我有一个函
  • 无法在 Octave 3.8 Ubuntu 中安装 Octave-forge 其他包

    我是 Octave 的新手 尝试安装 杂项 包以使用 GNU 单元 安装失败 我试过 apt get 安装八度杂项 deb 软件包已安装 但未在 Octave 3 8 中列出 通过 gt gt pkg list 然后我尝试 gt pkg i
  • Derby DB SQL,从行号开始选择行

    如何在 Derby DB 的 SQL 查询中从 X 行到 Y 行进行选择 例如 我想选择第 15 30 行 但不是前 15 行 选择从行号 30 开始的所有行 我尝试了 LIMIT 和 ROWNUM 但它们不起作用 我怎样才能在德比做到这一
  • php中如何检测ajax跨域请求

    对于普通的ajax请求我使用 strtolower SERVER HTTP X REQUESTED WITH xmlhttprequest 但这不适用于跨域请求 我能怎么做 Edit2 如果您以这种方式使用 jQuery ajax 函数 v
  • PHP 命名空间自动加载必须使用文件夹吗?

    我对在 php 中实现命名空间感到非常困惑 尤其是在别名导入类方面 我已经按照本教程中的教程进行操作 利用 PHP V5 3 命名空间实现可读且可维护的代码 http www ibm com developerworks opensourc
  • 带有可选字段的 JPA 存储库 findAll

    我有一个控制器尝试使用可选字段进行搜索 JPA实体类定义为 package demo import javax persistence Entity public class UploadFile Id GeneratedValue str
  • 安全策略文件和jar

    我有 RMI 应用程序 所以我需要使用策略文件 我的策略文件很简单 conf txt grant permission java security AllPermission 我从 eclipse 运行我的应用程序没有任何问题 我已将 Dj
  • HTML5、Canvas 和 FireFox

    我对下面所示的 HTML5 Canvas 代码有几个问题 该文本不会出现在 Firefox 3 6 中 它会出现在 Chrome 中 关于 ctx 变量 ctx c getContext 2d 是否应该反复重用该变量以在同一画布上创建其他矩
  • 现代 Fortran:无标签的输出格式

    我正在寻找一种不使用标签来指定输出格式的方法 为了理解我的意思 用标签 write 1001 icount x y 1001 format i5 f5 2 e12 3 没有标签应该是我放的format i5 f5 2 e12 3 在 wri
  • 为什么 User.Identity 不包含 ClaimsTypes 的完整列表?

    我正在开发 ASP NET Core Web 应用程序 我的 dotnet 版本是 3 1 401 我使用的是 Visual Studio Community 2019 版本 16 7 2 我在没有 ASP NET Core Identit
  • HTML 电子邮件在 Google Apps/Gmail 中无法正确显示

    我的 Web 应用程序向用户发送基于 HTML 的电子邮件 我创建了一个 HTML 电子邮件模板 基于 MailChimp 提供的模板 据说该模板可以在任何浏览器 电子邮件客户端中使用 当我使用发送它时SendGrid 它到达并完美地显示在
  • “tsc --out ... --declaration”不包括自定义接口

    Setup假设我们有两个文件 A ts 和 B d ts 现在在 A 里面我们有 class A implements B 现在假设我想将所有打字稿文件合并到一个单一的定义文件中 我知道如何执行此操作的唯一方法是创建一个 js 文件 然后创
  • 错误:任务“:app:dexDebug”执行失败。使用 Facebook Fresco 以非零退出值 2 完成

    我在这里阅读了有关此问题的每一条线索 但找不到我的问题的任何答案 添加 Fresco 库后 我在构建应用程序时收到此错误 有问题的行是 compile com facebook fresco fresco 0 5 3 错误 错误 任务 ap
  • 8位到16位转换

    我有一张捕获 8 位的图像 我正在寻找将 8 位值转换为 16 位值 我用了以下 short temp16 short val i lt lt 8 where val是一个 8 位样本的数组 上面的说法引起了噪音 有人能建议一种8位到16位
  • 将短整型复制到 char 数组

    我有一个名为 s int 的短整型变量 它的值 2 unsighed short s int 2 我想将此数字复制到字符数组的第一个和第二个位置 假设我们有char buffer 10 我们想要两个字节s int复制于buffer 0 an
  • 登录我的帐户时,Telethon 不断将我注销。电报、Python

    该代码似乎运行完美 在我最终再次注销之前 我什至有时间用机器人对其进行了短暂的测试 此时我已经尝试了大约 10 次 但 Telethon 似乎出于某种原因将我从手机上的 Telegram 中删除了 我不知道为什么会发生这种情况 而且我也没有
  • 当我使用 Objective-C 中定义的宏时,Swift 条件编译无法正常工作

    我在 Objective C 头文件中定义了一个简单的宏 并通过项目桥接头文件将该头文件导入到 Swift 中 我能够在 Swift 中使用这个宏作为常量 但是当我使用它进行条件编译时 它无法正常工作 我在 Xcode 10 2 1 中创建
  • 如何在 gtk 中将小部件作为不同的线程加载? (瓦拉)

    我创建了这个类 出于效率原因 我想将缩略图作为不同的线程加载到图标视图中 因为如果我在同一个线程中执行此操作 GUI 加载速度会非常慢 但是当我创建线程时 它不起作用 它绘制了一些缩略图 然后它们就消失了 当我使用 join 时 它有效 这