如何在 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 中将小部件作为不同的线程加载? (瓦拉) 的相关文章

  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • C# 是否可以中断 ThreadPool 内的特定线程?

    假设我已将一个工作项排入队列ThreadPool 但是如果没有要处理的数据 从BlockingQueue 如果队列为空并且队列中不再有工作 那么我必须调用Thread Interrupt方法 如果我想中断阻塞任务 但是如何用 a 做同样的事
  • 验证随时间变化的连续条件

    我想开发一个Python程序 从某个时刻开始 等待60秒再执行操作 该程序必须具有的另一个功能是 如果我更新初始时间 它必须开始检查条件 我想过用线程来做 但我不知道如何停止线程并以新的开始时间重新启动它 import thread imp
  • 双重检查锁定模式

    In 有伪代码来正确实现作者建议的模式 见下文 Singleton Singleton instance Singleton tmp pInstance insert memory barrier 1 if tmp 0 Lock lock
  • 使用 Tkinter 进行多线程 Python

    我用这些函数在画布上画小圆圈 这是绘制圆圈的函数 class Fourmis def init self can posx posy name radius self can can self largeur can int self ca
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • 使用 theano 进行多处理

    我正在尝试将 theano 与 cpu 多处理和神经网络库 Keras 结合使用 I use device gpu标记并加载 keras 模型 然后 为了提取超过一百万张图像的特征 我使用多处理池 该函数看起来像这样 from keras
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 有没有好的带有 TaskExecutor 的 Spring 线程示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我试图了解如何在使用 Spring 进行事务管理的 Java 应用程序中实现线程 我在中找到了 Tas
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • C++ 在循环中创建线程时出错

    我在 Visual Studio 2015 中运行以下命令时遇到问题 include
  • 运行多线程时双重释放或损坏

    我在 C 程序中遇到运行时错误 双重释放或损坏 该程序调用可靠的库 ANN 并使用 OpenMP 并行化 for 循环 glibc detected home tim test debug test double free or corru
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • 低级键盘钩子不在 UI 线程上

    我想为键盘挂钩创建一个好的库 我使用 SetWindowsHookEx 方法 我注意到如果我的应用程序的主线程繁忙 则应在任何系统 KeyDown 事件中调用的方法 hookProc 不会执行 我认为钩子应该这样制作 以便另一个线程负责它
  • 如何在 StatusIcon 上显示文本而不是设置图标?

    我是 Gtk 和 Python 的初学者开发人员 我正在尝试创建一个 gtk StatusIcon 显示文本字符串来代替图标 我如何使用 PixBuf 或任何其他方式来完成此任务 Thanks 使用 Python 和 GTK3 的示例 fr
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include

随机推荐

  • 选择时列名无效

    我有一张桌子叫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 时 它有效 这