WPF 多线程处理(5)

 

 

 

 

 

项目的目录:

 

以下是FileStroage的三个类:
分别是FileHelper,FileInfos,Win32

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Automatically.FileStroage
{
    public class FileHelper
    {
        public static FileInfos GetFileInfo(string path)
        {
            var fileInfos = new FileInfos();
            FileInfo fi = new FileInfo(path);
            fileInfos.Icon = Win32.GetIcon(path, true);
            fileInfos.Name = fi.Name;
            fileInfos.Path = fi.FullName;
            fileInfos.Size = fi.Length;
            return fileInfos;
        }
    }
}
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Automatically.FileStroage
{
    public class FileInfos
    {
        public Icon Icon { get; set; }

        public string Name { get; set; }

        public string Path { get; set; }

        public long Size { get; set; }
    }
}
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;

namespace Automatically.FileStroage
{
    public class Win32
    {  
        [DllImport("Shell32.dll")]   
        private static extern int SHGetFileInfo   
        (   
            string   pszPath,   
            uint   dwFileAttributes,   
            out   SHFILEINFO   psfi,   
            uint   cbfileInfo,   
            SHGFI   uFlags   
        );   
    
       [StructLayout(LayoutKind.Sequential)]   
       private   struct  SHFILEINFO   
       {   
            public   SHFILEINFO(bool   b)   
            {   
                hIcon=IntPtr.Zero;iIcon=0;dwAttributes=0;szDisplayName="";szTypeName="";   
            }   
            public   IntPtr   hIcon;   
            public   int   iIcon;   
            public   uint   dwAttributes;   
            [MarshalAs(UnmanagedType.LPStr,   SizeConst=260)]   
            public   string   szDisplayName;   
            [MarshalAs(UnmanagedType.LPStr,   SizeConst=80)]   
            public   string   szTypeName;   
       };

       private Win32()   
       {   
       }   
    
       private   enum   SHGFI   
       {   
            SmallIcon       =   0x00000001,   
            LargeIcon       =   0x00000000,   
            Icon         =   0x00000100,   
            DisplayName       =   0x00000200,   
            Typename       =   0x00000400,   
            SysIconIndex     =   0x00004000,   
            UseFileAttributes   =   0x00000010   
       }   

       public  static  Icon GetIcon(string   strPath,   bool   bSmall)   
       {   
            SHFILEINFO   info   =   new   SHFILEINFO(true);   
            int   cbFileInfo   =   Marshal.SizeOf(info);   
            SHGFI   flags;   
            if   (bSmall)   
              flags   =   SHGFI.Icon|SHGFI.SmallIcon|SHGFI.UseFileAttributes;   
            else   
              flags   =   SHGFI.Icon|SHGFI.LargeIcon|SHGFI.UseFileAttributes;   
    
            SHGetFileInfo(strPath,   256,   out   info,(uint)cbFileInfo,   flags);   
            return   Icon.FromHandle(info.hIcon);   
       }  
    }
}
View Code

 

下一篇:WPF 多线程处理(6)

上一篇:WPF 多线程处理(4)

转载于:https://www.cnblogs.com/fengqingyangNo1/p/3266031.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF中使用OpenTK进行多线程渲染可以通过以下步骤实现: 1. 创建一个继承自`System.Windows.Threading.DispatcherObject`的类,该类将用于在WPF线程上执行OpenGL渲染操作。 ```csharp public class OpenGLRenderer : DispatcherObject { private GLControl glControl; public OpenGLRenderer(GLControl control) { glControl = control; } public void Render() { Dispatcher.Invoke(() => { // 在WPF线程上执行OpenGL渲染操作 glControl.MakeCurrent(); // 执行OpenGL渲染操作 // ... glControl.SwapBuffers(); }); } } ``` 2. 在WPF的UI线程上创建一个OpenGL渲染控件,并将其添加到WPF窗口中。 ```csharp GLControl glControl = new GLControl(); // 设置OpenGL控件的属性和事件处理程序 // ... // 创建OpenGL渲染器,并将OpenGL控件传递给它 OpenGLRenderer renderer = new OpenGLRenderer(glControl); // 将OpenGL控件添加到WPF窗口中 myWindow.Children.Add(glControl); ``` 3. 创建一个后台线程,用于执行OpenGL渲染操作。 ```csharp Thread renderThread = new Thread(() => { while (true) { // 执行OpenGL渲染操作 renderer.Render(); // 控制渲染帧率,可根据实际需求进行调整 Thread.Sleep(16); // 60帧/秒 } }); renderThread.Start(); ``` 在这个例子中,我们创建了一个继承自`DispatcherObject`的类`OpenGLRenderer`,它用于在WPF的UI线程上执行OpenGL渲染操作。然后在WPF的UI线程上创建了一个OpenGL渲染控件,并将其添加到WPF窗口中。最后,在一个后台线程上执行OpenGL渲染操作,通过调用`OpenGLRenderer`的`Render`方法来在WPF线程上执行OpenGL渲染操作。 需要注意的是,在多线程渲染时,需要确保线程安全,避免多个线程同时访问OpenGL渲染上下文。在上述示例中,我们使用了`DispatcherObject`来确保在WPF线程上执行OpenGL渲染操作,从而避免了多线程访问OpenGL渲染上下文的冲突。 希望这些信息对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值