C#关于委托的问题。 C#的代码真心难搞,搞了一天没搞出来。

大_爱 2013-04-01 05:50:50
主线程启动了一个线程,线程里面调用了杀毒软件,我想得到杀毒软件的进度,显示在进度条上,

用伪代码表达一下意思吧。

From f = new From();
Thread t = new Thread(monitoringFile);

public void monitoring(){
while(true){
if(xxx){
sd();
}
}

public void sd(){
//这里杀毒,但是如何才能讲杀毒的进度推送到 进度条上,我用委托,委托貌似穿参数挺复杂,
//准备启动一个线程去更新进度条,结果界面老死。
}


麻烦C# 板的大牛 指点一下。


...全文
202 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
大_爱 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 gxingmin 的回复:
这两句防卡死
亲,我测试2G的文件还是会出现 未响应的状况啊。
大_爱 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 gxingmin 的回复:
这两句防卡死
感谢,我想问题基本解决了。结贴下班。 多谢了!!
gxingmin 2013-04-01
  • 打赏
  • 举报
回复
这两句防卡死
大_爱 2013-04-01
  • 打赏
  • 举报
回复
引用 5 楼 gxingmin 的回复:
public delegate void myThreadHandler(); private void Form1_Load(object sender, EventArgs e) { Thread mt = new Thread(myThread); mt.Start(); } pri……
亲,感谢你,我还不知道能不能用。正在努力修改。 Thread.Sleep(10); Application.DoEvents(); 不知道这两句代码有何妙用?
gxingmin 2013-04-01
  • 打赏
  • 举报
回复
public delegate void myThreadHandler(); private void Form1_Load(object sender, EventArgs e) { Thread mt = new Thread(myThread); mt.Start(); } private void myThread() { myThreadHandler o=new myThreadHandler(monitorListView); this.BeginInvoke(o); } private void monitorListView() { while (isavle) { if (nvColletion.Count > 0) { newSDpro(); } Thread.Sleep(10); Application.DoEvents(); } } 进度条你直接在newSDpro函数里加就可以了
大_爱 2013-04-01
  • 打赏
  • 举报
回复
想在newSDpro方法中 把进度推送到界面上去。 我在里面弄了个Thread,效果不好,界面容易死,而且进度是假的。
大_爱 2013-04-01
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
public delegate void myThreadHandler(); From f = new From(); Thread t = new Thread(myThread); private void myThread() { myThreadHandler o=new myThreadHandler(monitoring); ……
实在有点看不懂,我贴上我的代码吧

 private void Form1_Load(object sender, EventArgs e)
        {
           Thread mt = new Thread(monitorListView);
            mt.Start();

}

private void monitorListView()
        {
            while (isavle)
            {
                if (nvColletion.Count > 0)
                {
                    newSDpro();
                }
            }
        }


public void newSDpro()
        {

            if (nvColletion.Count > 0)
            {
                String sdPath = Properties.Settings.Default.sdPath;
                String logPath = Properties.Settings.Default.logPath;

                //MessageBox.Show("得到的杀毒软件路径:" + sdPath);

                if (sdPath == null || sdPath.Equals(""))
                {
                    MessageBox.Show("杀毒软件未配置,请点击左下角的配置杀毒软件!!");
                    return;
                }
                if(logPath == null || logPath.Equals("")){
                    MessageBox.Show("日志文件路径尚未配置");
                    return;
                }

                string time = DateTime.Now.ToString();
                string filename = DateTime.Now.ToLongDateString().ToString() + ".log";
                string filepath = logPath + "\\" + filename;
                
                if (!IsFileReady(filepath))
                {
                    Thread.Sleep(100);
                }
                 
                FileStream f = new FileStream(filepath, FileMode.OpenOrCreate | FileMode.Append);

                ProcessStartInfo pinfo = new ProcessStartInfo(sdPath);
                pinfo.UseShellExecute = false;
                pinfo.RedirectStandardOutput = true;
                pinfo.CreateNoWindow = true;
                pinfo.WindowStyle = ProcessWindowStyle.Hidden;
                StreamWriter sw = new StreamWriter(f);

                Dictionary<String, String>.Enumerator enumerator = nvColletion.GetEnumerator();
                
                while (enumerator.MoveNext())
                {
                    String sourFile = enumerator.Current.Key;
                    if (sdPath.EndsWith("ecls.exe"))
                    {
                        pinfo.Arguments = "-aind " + sourFile;
                    }
                    else
                    {
                        pinfo.Arguments = "scan " + sourFile;
                    }

                    proc = Process.Start(pinfo);

                    DirectoryInfo di = new DirectoryInfo(sourFile);

                    if(di.Exists){
                        value = di.GetFiles().Length;
                    }else{
                        value = nvColletion.Count;
                    }
                    
                    Thread pThread = new Thread();
                    pThread.Start();
                    
                    while (!proc.HasExited)
                    {
                        String line = proc.StandardOutput.ReadLine();
                        sw.WriteLine(line);
                        sw.Flush();
                    }
                    sw.Close();
                    
                    procbarvalue++;

                    String destFile = nvColletion[sourFile];
                    if (di.Exists)
                    {
                        String tmp = sourFile.Substring(sourFile.LastIndexOf("\\"));
                        destFile += tmp;
                        CopyFolder(sourFile, destFile);
                    }
                    else
                    {
                        if (!destFile.EndsWith("\\"))
                        {
                            destFile += "\\";
                        }
                        try{
                            File.Copy(sourFile, destFile + Path.GetFileName(sourFile), true);
                        }catch(IOException){
                            MessageBox.Show("文件复制出错,可能是文件已经损坏");
                        }
                    }
                    nvColletion.Remove(sourFile);
                    procbarvalue = 0;
                    break;
                }
            }
            else
            {
                MessageBox.Show("选择要传输的文件");
                return;
            }
        }

大_爱 2013-04-01
  • 打赏
  • 举报
回复
C#板回复好快,我先理解理解,java转C#新手,多多包含。
gxingmin 2013-04-01
  • 打赏
  • 举报
回复
public delegate void myThreadHandler(); From f = new From(); Thread t = new Thread(myThread); private void myThread() { myThreadHandler o=new myThreadHandler(monitoring); this.BeginInvoke(o); } public void monitoring(){ while(true){ if(xxx){ sd(); } } public void sd(){ progressbar1.Value=...; //progressbar1.Refresh();}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧