热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:图片框可见性中的动画gif随委托子和后台线程而变化

篇首语:本文由编程笔记#小编为大家整理,主要介绍了图片框可见性中的动画gif随委托子和后台线程而变化相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了图片框可见性中的动画gif随委托子和后台线程而变化相关的知识,希望对你有一定的参考价值。



我有一个主要形式的Telerik RadRibbonBar,其中有许多按钮。其中一些按钮使窗体中的某些面板可见,这些面板填充除RadRibbonBar及其按钮之外的所有主要窗体。

这些面板有一些动态计算的形式,它们需要0到2-3分钟才能打开。因此,我们决定在面板和带有动画gif的PictureBox之间放置一个表单。我的问题是,一旦我用动画gif将新形式设置为.visible = False,我就无法从图片框中获取动画gif。

我在这里放了一些代码,看看是否有人可以帮助我。

Public Sub MICommand1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MICommand1.Click
cargando = True
makevisiblePanel(1)
azkenpanelzenbakia = 1
cargando = False
End Sub
Public Sub MICommand2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MICommand2.Click
cargando = True
makevisiblePanel(2)
azkenpanelzenbakia = 2
cargando = False
End Sub

等等许多其他按钮。现在makevisiblePanel(byval面板为整数)

Private Sub makevisiblePanel(ByVal panel As Integer)
rf.Visible = True
If Not loaded Then
makeeverypanelInvisible()
firstCallPanelInLoad(panel)
rf.Visible = False
Else
makeeverypanelInvisible()
backgroundworkerRA(panel)
End If
End Sub

后台工作程序的定义如下:

Private Sub backgroundworkerRA(ByVal panel As Integer)
Dim t As New Threading.Thread(Sub() selectVisiblePanel(zein))
t.IsBackground = True
t.Start()
End Sub
Private Sub selectVisiblePanel(ByVal zein As Integer)
selectVisiblePanel_threadasko_rf()
Select Case zein
Case 0
selectVisiblePanel_threadasko_P10()
selectVisiblePanel_threadasko_Rp()
Case 1
selectVisiblePanel_threadasko_P1()
selectVisiblePanel_threadasko_Rd1()
'Some lot more cases
End Select
selectVisiblePanel_threadasko_rf_v(False)
Select Case zein
Case 0
selectVisiblePanel_threadasko_P10Front()
Case 1
selectVisiblePanel_threadasko_P1Front()
'Lots more cases
End Select
End Sub

我首先看到面板可见,然后用send.toBack将它们放在表格的背面,然后在让我的面板不可见之后我将它们放回到前面。

像这样每个selectVisiblePanel都有一个Delegate Sub和一个Panel#number.Visible = True。像这样:

Delegate Sub rfCallBack()
Private Sub selectVisiblePanel_threadasko_rf()
If Me.rf.InvokeRequired Then
Dim d As New rfCallBack(AddressOf selectVisiblePanel_threadasko_rf)
Me.Invoke(d, New Object() {})
Else
Me.rf.WindowState = FormWindowState.Maximized
End If
End Sub
Delegate Sub rf_vCallBack(ByVal vf As Boolean)
Private Sub selectVisiblePanel_threadasko_rf_v(ByVal vf As Boolean)
If Me.rf.InvokeRequired Then
Dim d As New rf_vCallBack(AddressOf selectVisiblePanel_threadasko_rf_v)
Me.Invoke(d, New Object() {vf})
Else
Me.rf.Visible = vf
End If
End Sub
Delegate Sub P1CallBack()
Private Sub selectVisiblePanel_threadasko_P1()
If Me.Panel1.InvokeRequired Then
Dim d As New P1CallBack(AddressOf selectVisiblePanel_threadasko_P1)
Me.Invoke(d, New Object() {})
Else
Me.Panel1.Visible = True
Me.Panel1.SendToBack()
End If
End Sub
Delegate Sub RD1CallBack()
Private Sub selectVisiblePanel_threadasko_Rd1()
If Me.RadDock1.InvokeRequired Then
Dim d As New P1CallBack(AddressOf selectVisiblePanel_threadasko_Rd1)
Me.Invoke(d, New Object() {})
Else
Me.RadDock1.Visible = True
End If
End Sub

我希望在我使用的新表单中可以在PictureBox中看到.gif,但我只是在创建主表单时看到它。当我点击RadribbonBar中的任何一个按钮时,我只看到面板但我没有看到PictureBox。

我在一个简单的应用程序中使用更简单的代码,我用它来进行快速调试。

如果有人能帮助我,我会很高兴。

What I get

What I would like to get


答案

我找到了问题的答案。我在面板中打开了新表格。每个小组都有4-5个新表格。我想用带有gif的pictureBox显示我的面板,而后面板中的其他表单正在加载。

在WinForms中,您不能使用backgroundWorker在doWork部分中加载表单/面板,或者在主线程负责新表单的另一个线程中。 https://msdn.microsoft.com/es-es/library/system.componentmodel.backgroundworker(v=vs.110).aspx

我必须做一个解决方法,并在我的面板中加载的每个表单中使用多线程或后台工作程序。这样我就可以为面板中的每个表单显示一次图片框,而不是面板中所有表单的1。

我希望其他人能从我的麻烦中得到帮助。

工作面板示例:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'''''''' Here I load my dtgas and dting that can take up to 2 min to load from DB.
Dim dtgas as System.Data.DataSet = loadFromDB(dataBeg, dataEnd)
Dim dting as System.Data.DataSet = loadFromDB(dataBeg, dataEnd)
Dim obj(1) As Object
obj(0) = dtgas
obj(1) = dting
'System.Threading.Thread.Sleep(10000)
e.Result = obj
dtgas.Dispose()
dting.Dispose()
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
'get the answer from the dowork with e.result
Dim r(1) As Object
If e.[Error] IsNot Nothing Then
Exit Sub
End If
r = e.Result
If r IsNot Nothing Then
Showradcharviewtotals(r(0), r(1))
End If 'Make the RadChartView Visible and then the panel with the image not visible
RCVListA.Visible = True
Panel11.Visible = False
End Sub

在加载或从load调用的子函数中:

Private Sub CalledFromLoad_MyDataLoad()
RCVListA.Visible = False
Panel11.Dock = DockStyle.Fill
Panel11.Visible = True
BackgroundWorker1.RunWorkerAsync()
End Sub


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 阅读spring5源码DefaultSingletonBeanRegistry类遇到问题发现SpringBean中存在大量回调机制和aware接口,于是特意去了解 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有