c#程序载入过程中显示载入等待界面怎么做

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#程序载入过程中显示载入等待界面怎么做相关的知识,希望对你有一定的参考价值。

我做的winform程序中,由于导入数据库会很长一段时间,就做了一个类似载入游戏时出现小漏斗的的一个panel。我用的是 Stopwatch sw = new Stopwatch();当sw.start()时显示这个panel。可是这个panel上面的东西显示不出来,上面的控件就是灰色的,不管载入的时间长短都是这样。
请问下这个问题该怎么解决?或者想实现这个功能用什么其他的办法好一些呢

导致楼主出现的结果,是因为楼主将所有逻辑放在了主线程里,系统就一步一步来的。
楼主可以使用多线程的方法来实现所期望的结果。
步骤如下

1、实例化导入数据子线程
2、等待子线程完成
3、操作主线程

这里面可能涉及到2个问题,一个是,如何判断子线程完成了,一个是涉及到跨线程操作控件的问题。
第一个问题,可以使用一个timer控件,每隔一秒判断一次子线程状态。
第二个问题,最简单的方式是再构造器下添加“CheckForIllegalCrossThreadCalls = false;”

代码参考。请自行组合。

1)全局变量
private Thread tConnectionDB;

2)加载事件
//显示漏斗
//实例化子线程
tConnectionDB = new Thread(new ThreadStart(Connection));
tConnectionDB.Start();

3)Timer事件
if (tConnectionDB.ThreadState == ThreadState.Stopped)//判断线程是否停止

//显示数据

//停止Timer控件
timer1.Enable=false;
追问

tConnectionDB = new Thread(new ThreadStart(Connection));
这句里面的connection是什么东西啊?
还有就是你说的“CheckForIllegalCrossThreadCalls = false;”这个东西在哪里添加。
能说清楚些吗,我不是很懂

追答

Connection指的是,读取数据库数据的那个方法。
比如你有个全局变量DataTable dt,这个变量是用来存放你读取到的数据表
而这个方法,就用Connection命名吧,注意,tConnectionDB = new Thread(new ThreadStart(Connection));里,子线程的方法是没有括号的哦。

假设你的Connection方法,也就是子线程的方法,他操作了某个控件,比如修改了Panle的Visible属性,那么程序肯定要报错,因为Panle是主线程的控件,子线程是不能修改他的。正确的做法是使用委托,但是写起来可能有点麻烦,而且我也不会标准的写法,所以就姑且用“CheckForIllegalCrossThreadCalls = false;”
楼主可以先不添加这段代码,当程序报错,提示你跨线程操作控件时,请在窗体的构造器下,添加如下代码。
构造器就是
public Form1()

InitializeComponent();
CheckForIllegalCrossThreadCalls = false;//添加在这里

参考技术A 不要用单线程做,因为单线程载入时不会一边载入一边给用户反馈,用双线程或时钟控件timer当作循环,每次比对一下载入文件大小和源文件大小,二者相等时关闭反馈窗口,打开程序。追问

请问下,我怎么比对载入文件和源文件的大小呢?

追答

载入文件的话很简单,你用的再入文件类中都会自带以载入的属性。源文件的话你要从文件信息里读取了。

参考技术B 用进程去载和数据 在进程中更新载入的实时状态 参考技术C panel.Enable有没有设为true啊

HighGUI图形图像界面初步—— 图像的载入显示与输出

HighGUI模块为高层GUI图形用户界面模块,包含媒体的输入输出、视频捕捉、图像和视频的编解码、图形交互界面的接口等。

在本章中,我们将学到:

  • 图像的载入、显示和输出到文件的详细分析
  • 滑动条的创建和使用
  • OpenCV中的鼠标操作

1、图像的载入与显示概述

  在新版的opencv2中,最简单的图像载入和显示只需两句代码,非常便捷。这两个行代码分别对应两个函数:imread()和imwrite()。

  1.1 图像的载入:imread()函数

  Mat imread(const string& filename, int flags = 1);

  参数说明:

  (1)第一各参数:图片路径+图片名。OpenCV的imread函数支持如下类型的图像载入。

        Windows位图:*.bmp, *.dib

     JPEG文件:*.jpeg, *.jpg, *.jpe

          JPEG2000文件:*.jp2

     PNG图片:*.png

     便携文件格式:*.pbm, *.pgm, *.ppm

     Sun raters光栅文件:*.sr, *.ras

     TIFF文件:*.tiff, *,tif

  (2)第二个参数:载入标识符。它指定了加载图像的颜色类型,默认值为1。这个参数可以在OpenCV中表示图像格式的枚举体中取值。

    

      CV_LOAD_IMAGE_UNCHANGED —— 等价取值-1,这个标识在新版中已经废置,忽略。

      CV_LOAD_IMAGE_GRAYSCALE —— 等价于取值0,始终将图像转换为灰度再返回。

      CV_LOAD_IMAGE_COLOR —— 等价取值1,总是讲图像转换成彩色再返回。

      CV_LOAD_IMAGE_ANYDEPTH —— 等价取值2,如果去这个标识,且载入图像深度为16位或者32位,则返回对应深度图像,否则转为8位图像再返回。

      CV_LOAD_IMAGE_ANYCOLOR -—— 等价取值4。

    对于参数 flags,如果我们不在枚举体中取值,那么可以这样进行:

      flags>0返回三个通道的彩色图像

      flags=0返回灰度图像

      flags<0返回包含Alpha通道的加载图像

  

  1.2 图像的显示:imshow()函数

  void imshow(const string & windowname, InputArray mat);

  参数说明:

    第一个参数:窗口名称

    第二个参数:需要显示的图像,Mat类型。

   如果窗口使用CV_WINDOW_AUTOSIZE标志创建,那么显示图像原始大小。

   否则按照图像的深度进行缩放,具体如下:

    载入图像类型      |        显示大小   

    8-bit unsigned    |    原样输出

    16-bit unsigned     |        使用像素值除以256,也就是值得范围是[0,255x256]映射到[0,255]

    32-bit unsigned  |  同上

    32-bit float point    |       像素要乘以255,也就是范围[0,1]映射到[0,255]

 

   如果设定了支持OpenGL(WINDOW_OPENGL),那么imshow还支持ogl::Buffer、ogl::Texture2D以及gpu::GpuMat作为输入。

 

2、关于InputArray类型

  很多时候,我们遇到函数原型中的InputArray/OutputArray类型,只需要简单地转为Mat类型即可。

 

3、创建窗口:namedWindow()函数

  如果只是简单地显示图像,我们可以不用创建窗口,直接在imshow函数中给出窗口名称即可。

  但是我们后续学习到的滑动条的使用,要制定滑动条依附到那个窗口上,这时候就要给出窗口的实例。

  namedWindow()函数原型:

    void nameWindow(const string & winname, int flags=WINDOW_AUTOSIZE);

    参数说明

       第一个参数:窗口名称

    第二个参数:窗口标识符。可以填一下集中取值。

      WINDOW_NORMAL,用户可以改变窗口大小。

      WINDOW_AUTOSIZE,窗口大小会自动调整以适应所显示的图像,用户不能手动修改图像大小。

      WINDOW_OPENGL,设置后窗口会支持OpenGL。

    以上三个标识符,是在OpenCV1中,如果在OpenCV2中,那么需要加前缀CV_:

      CV_WINDOW_NORMAL

      CV_WINDOW_AUTOSIZE

      CV_WINDOW_OPENGL

    

4、输出图像到文件:imwrite()函数

  bool imwrite(const string& filename, InputAaary img, const vector<int> &params=vector<int>() );

  参数说明

  (1)第一个参数,需要写入的目标文件名,需要带上后缀。

  (2)第二个参数,InputArray类型图像,一般填一个Mat类型图像数据。

  (3)第三个参数,表示为特定格式保存的参数编码,默认不用填。如果填的话,下面需要了解的地方。

    对于JPEG格式图片,这个参数表示从0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.

    对于PNG格式图片,表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9,较高的值意味着更小的尺寸和更长的压缩时间,默认为3.

    对于PPM, PGM, 或者PBM格式的图片,表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或者1,默认为1.

    

 

以上是关于c#程序载入过程中显示载入等待界面怎么做的主要内容,如果未能解决你的问题,请参考以下文章

如何让html内容在页面载入后显示

c# 未能载入文件或程序集

苹果手机微信载入数据失败怎么办

6.29.日报

水晶报表,c#中,怎么在Winform应用程序中设计功能载入rpt水晶报表文件?

unity3d中怎么制作关卡载入进度条