关于c#:如何在另一个线程中旋转矩形而不在WPF中创建新的RotateTransform? | 珊瑚贝

how to rotate a rectangle in another thread without create new RotateTransform in WPF?


我为实时 PPI 显示器开发了一个 WPF 应用程序。我想在 Animator Thread() 中旋转一个名为”手”的矩形。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public unsafe void Animator_Thread()
            {
            RotateTransform rotateTransform = new RotateTransform(ins_angle);
            while (true)
                {                  
                this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                new Action(delegate()
                    {
                      //update hand angle
                    rotateTransform.Angle = ins_angle ;
                    hand.RenderTransform = rotateTransform;
                    //hand.RenderTransform = new RotateTransform(ins_angle);

                     //update Bitmap
                    image1.Source = BitmapSource.Create(width, height,
                   dpiX,dpiY,pixelFormat,myPalette,Image_Buff,stride);                        }));
                }
            }

但是当我运行线程时会出现这个错误:(

The calling thread cannot access this object because a different
thread owns it.

当我使用注释行

1
//hand.RenderTransform = new RotateTransform(ins_angle);

而不是

1
2
rotateTransform.Angle = ins_angle ;
hand.RenderTransform = rotateTransform;

它有效。但由于耗时,我不想在每个循环中创建新的 RotateTransform。我该如何处理这个问题?

编辑:我是 C# 编程的初学者。
我不断地从局域网接收数据。为了处理和显示这些数据,我使用多个线程,例如
#数据获取线程
#rotate PPI 指针(与时钟指针相同)并更新显示位图线程。
我在图中的不同时间计算了这个动作。我希望在不到 5 毫秒的时间内完成这些工作。但有时这一行”hand.RenderTransform = new RotateTransform(ins_angle);”一个人会花更多的时间。

最后我的问题
有什么方法可以比我更快地旋转物体吗?
有什么方法可以比我更快地创建位图吗?
谢谢。


你的问题不是很清楚。但是您既不需要循环也不需要线程来为 UI 元素的 RenderTransform 设置动画。

只需使用下面示例中的内置动画,它会以 360?°/s 的速度连续为 RotateTransform 的 Angle 属性设置动画。

1
2
3
4
5
6
7
8
9
10
11
12
var rotateTransform = new RotateTransform();
hand.RenderTransform = rotateTransform;
hand.RenderTransformOrigin = new Point(0.5, 0.5);

rotateTransform.BeginAnimation(
    RotateTransform.AngleProperty,
    new DoubleAnimation
    {
        By = 360,
        Duration = TimeSpan.FromSeconds(1),
        RepeatBehavior = RepeatBehavior.Forever
    });

编辑:如果您只是在后台线程中接收到一些位置数据,您需要做的就是在 Dispatcher 操作中更新现有 RotateTransform 的 Angle 属性。

前提是RenderTransform已经包含一个RotateTransform,之前在UI线程中分配过一次:

1
hand.Dispatcher.Invoke(() => ((RotateTransform)hand.RenderTransform).Angle = ins_angle);

如果您想将元素动画到新位置:

1
2
3
4
5
6
hand.Dispatcher.Invoke(() =>
{
    hand.RenderTransform.BeginAnimation(
        RotateTransform.AngleProperty,
        new DoubleAnimation(ins_angle, TimeSpan.FromSeconds(1)));
});
  • 感谢您的回复。但我不断从局域网接收数据。为了处理和显示这些数据,我将使用多个线程,例如 #data 采集线程 #rotate PPI 指针(与时钟指针相同)和更新显示位图线程
  • 谁告诉你的?如果您在后台线程中收到一个新angular,则在 Dispatcher.Invoke 调用中分配一次 RotateTransform\\ 的angular就足够了。没有循环,没有额外的线程。请参阅我的编辑。
  • 有什么方法可以比我更快地创建位图吗?谢天谢地。
  • 对于您建议的编辑,我拒绝了它,因为它没有提供任何相关的内容。请注意,您没有在问题中告诉任何有关 delta 值的信息。另请注意,您不应在此处指定动画的 From 值,因为无论如何它都应该根据当前值进行动画处理。
  • 与其每次都创建一个新的 BitmapSource,不如先创建一个 WriteableBitmap,然后只更新它的缓冲区。


来源:https://www.codenong.com/45259451/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9222.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?