小编vul*_*ino的帖子

如何从另一个类中运行的另一个线程更新UI

我目前正在编写我的第一个关于C#的程序,而且我对该语言非常陌生(迄今为止只用于C).我做了很多研究,但所有的答案都太笼统了,我根本无法解决问题.

所以这里是我(非常常见)的问题:我有一个WPF应用程序,它从用户填充的几个文本框中获取输入,然后使用它来对它们进行大量计算.它们应该花费大约2-3分钟,所以我想更新进度条和文本块,告诉我当前的状态.此外,我需要存储用户的UI输入并将它们提供给线程,所以我有第三个类,我用它来创建一个对象,并希望将此对象传递给后台线程.显然我会在另一个线程中运行计算,因此UI不会冻结,但我不知道如何更新UI,因为所有计算方法都是另一个类的一部分.经过大量的研究后,我认为最好的方法是使用调度员和TPL,而不是背景工作者,但说实话,我不确定它们是如何工作的,经过大约20个小时的试错和其他答案,我决定问我自己的问题.

这里有一个非常简单的程序结构:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        Initialize Component();
    }

    private void startCalc(object sender, RoutedEventArgs e)
    {
        inputValues input = new inputValues();

        calcClass calculations = new calcClass();

        try
        {
             input.pota = Convert.ToDouble(aVar.Text);
             input.potb = Convert.ToDouble(bVar.Text);
             input.potc = Convert.ToDouble(cVar.Text);
             input.potd = Convert.ToDouble(dVar.Text);
             input.potf = Convert.ToDouble(fVar.Text);
             input.potA = Convert.ToDouble(AVar.Text);
             input.potB = Convert.ToDouble(BVar.Text);
             input.initStart = Convert.ToDouble(initStart.Text);
             input.initEnd = Convert.ToDouble(initEnd.Text);
             input.inita = Convert.ToDouble(inita.Text);
             input.initb = Convert.ToDouble(initb.Text);
             input.initc = Convert.ToDouble(initb.Text);
         }
         catch
         {
             MessageBox.Show("Some input values are not of …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading

38
推荐指数
3
解决办法
10万
查看次数

SQL加入三个表,加入优先级

我有三张桌子:R,S和P.

表R通过外键与S连接; 有应该是S中至少一个的记录,所以我可以加入:

SELECT
        *
    FROM 
        R
    JOIN    S ON (S.id = R.fks)
Run Code Online (Sandbox Code Playgroud)

如果在S中没有记录,那么我没有行,这没关系.

然后表S与P连接,其中记录是P可能存在也可能不存在并且与S连接.

所以我这样做

SELECT
        *
    FROM 
        R
    JOIN    S ON (S.id = R.fks)
    LEFT JOIN P ON (P.id = S.fkp)
Run Code Online (Sandbox Code Playgroud)

如果我想将第二个JOIN绑定到S而不是R,如果我可以使用括号,该怎么办?

SELECT
        *
    FROM 
        R
    JOIN    (S ON (S.id = R.fks) JOIN P ON (P.id = S.fkp))
Run Code Online (Sandbox Code Playgroud)

或者这是R,S和P之间笛卡尔积的自然行为?

sql

23
推荐指数
1
解决办法
2万
查看次数

需要重载operator <和null检查

我在c#中重载了lessthan-operator,我想知道这是否需要检查null.您可以在下面找到一个示例:

public static bool operator <(MyClass x, MyClass y)
{
  if (x == null && y == null)
  {
    return false;
  }
  if (x == null)
  {
    return true; //false?
  }
  if (y == null)
  {
    return false; //true?
  }
  return x.Value < y.Value;
}
Run Code Online (Sandbox Code Playgroud)

或者这是正确的:

public static bool operator <(MyClass x, MyClass y)
{
  return x.Value < y.Value;
}
Run Code Online (Sandbox Code Playgroud)

我没有找到任何关于此的指示.但也许我错过了什么.

c# operator-overloading

14
推荐指数
2
解决办法
6969
查看次数

MySql存储过程,事务和回滚

我找不到在MySql存储过程中使用事务的最佳方法.ROLLBACK如果有任何失败我想要:

BEGIN

    SET autocommit=0;
    START TRANSACTION;

    DELETE FROM customers;
    INSERT INTO customers VALUES(100);
    INSERT INTO customers VALUES('wrong type');

    COMMIT;
END
Run Code Online (Sandbox Code Playgroud)

1)autocommit=0需要吗?

2)如果第二个INSERT中断(当然它确实),第一个INSERT不会回滚.程序只是继续下去COMMIT.我怎么能阻止这个?

3)我发现我可以DECLARE HANDLER,我应该使用这条指令还是有更简单的方法来说如果任何命令失败,存储过程应该ROLLBACK也会失败?

DECLARE HANDLER工作正常,但由于我有MySql版本5.1我不能使用RESIGNAL.因此,如果发生错误,将不会通知来电者:

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
    ROLLBACK; 
    -- RESIGNAL; not in my version :(
END;

START TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

mysql stored-procedures commit rollback

11
推荐指数
1
解决办法
2万
查看次数

WinForms锚定控件无法正确最大化

我有WinForms(VB.NET)的问题.

主窗口是MDI容器.用户打开一个新的子窗口:

非最大化的孩子1

然后最大化它,因此窗口正确填充客户区.我的控件已正确锚定(使用IDE属性Anchor)到窗口两侧,以便扩大窗口总是很好地填充客户区:

最大化的孩子1

在这种状态下(客户端窗口最大化),用户打开一个不同的或新的子窗口,但新的窗口控件没有拉伸,即他们不"理解"他们应该拉伸!

非伸展的孩子2

这特别令人讨厌,因为如果用户试图恢复窗口,那么控件就会被拉伸,所以它们会消失(看不到列表视图了)!

恢复孩子2

这是一个错误吗?我怎么解决这个问题?

编辑:根据Hans Passant的评论,我创建了一个新的简单项目,它可以正常工作.所以我调查了一下与我的真实项目和样本有什么不同.不同的是,在我的项目中,我动态创建表单.

我在工具栏上动态创建了许多按钮.当用户单击按钮时,这是执行的代码:

Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Cursor.Current = Cursors.WaitCursor

        Dim b As Button = CType(sender, Button)

        Dim assem As Assembly = Assembly.GetExecutingAssembly()
        Dim formType As Type = assem.GetType(CStr(b.Tag))

        Dim exFormAsObj As Object = Nothing
        Try
            exFormAsObj = Activator.CreateInstance(formType)
        Catch ex As Exception
            Cursor.Current = Cursors.Default
            MessageBox.Show("clicca meglio:" + ex.ToString)
            Exit Sub
        End Try

        Dim f As Form = CType(exFormAsObj, Form)
        f.MdiParent = Me
        f.Show()

        Cursor.Current = Cursors.Default …
Run Code Online (Sandbox Code Playgroud)

.net controls winforms

8
推荐指数
1
解决办法
2494
查看次数

VB.NET ArrayList to List(Of T)类型的复制/转换

我有一个返回旧式ArrayList的第三方方法,我想将其转换为类型化的ArrayList(Of MyType).

Dim udc As ArrayList = ThirdPartyClass.GetValues()
Dim udcT AS List(Of MyType) = ??
Run Code Online (Sandbox Code Playgroud)

我做了一个简单的循环,但必须有一个更好的方法:

Dim udcT As New List(Of MyType)
While udc.GetEnumerator.MoveNext
    Dim e As MyType = DirectCast(udc.GetEnumerator.Current, MyType)
    udcT.Add(e)
End While
Run Code Online (Sandbox Code Playgroud)

vb.net type-conversion

6
推荐指数
1
解决办法
3万
查看次数

无法理解.net 2010跟踪和app.config

在我的app.config中,我想设置3个跟踪级别(交换机?):详细,警告和无.在代码的调试版本中,我想要在我想要警告的版本中激活详细开关.在特殊情况下,我的应用程序用户可以修改配置文件以禁用所有跟踪.

我希望在控制台上输出调试跟踪,而发布只跟踪到日志文件.

我写了以下内容:

[...]
<system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
          <source name="debug" switchName="debug">
            <listeners>
              <add name="FileLog"/>
              <add name="console"/>
            </listeners>
          </source>

          <source name="release" switchName="release">
            <listeners>
              <add name="FileLog"/>
            </listeners>
          </source>

          <source name="silent" switchName="none">
            <listeners/>
          </source>
        </sources>


        <switches>
            <add name="debug" value="Verbose"/>
            <add name="release" value="Warning"/>
            <add name="none" value="Off"/>
        </switches>


        <!--<sharedListeners>
            <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener"  traceOutputOptions="DateTime" initializeData="felix.log"/>
            <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
        </sharedListeners>-->

        <trace autoflush="false" indentsize="4">
          <listeners>
              <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
              <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
              <remove name="Default"/>
          </listeners>
        </trace> …
Run Code Online (Sandbox Code Playgroud)

.net logging trace system.diagnostics visual-studio-2010

5
推荐指数
1
解决办法
3996
查看次数

C#中的PreTranslateMessage用于托管的MFC窗口

我们开发了一个MFC应用程序,其中主窗口是在DLL中实现的.为了对其进行修改,我们正在考虑将其更改为WPF应用程序,其中"旧"本机窗口在Wpf窗口中被重新托管.到现在为止还挺好.

但是,我们的旧MFC应用程序在应用程序级别捕获了一些消息(例如:防止鼠标单击或键盘输入).要重新托管WPF应用程序中的MFC窗口,我们需要一种方法从WPF应用程序中捕获这些窗口,并要求旧的MFC窗口预翻译它们......

这有可能吗?

我想在HwndHost中重新托管MFC窗口,然后添加一个消息钩子.我的桥接CLR-DLL中的代码看起来像这样(并没有实现我想要的):

MyHwndHost ^handle = gcnew MyHwndHost(pContentWnd);
handle->MessageHook += gcnew HwndSourceHook(&CVSimCoreNat::ControlMsgFilter);
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

c# hosting mfc interop windows-messages

5
推荐指数
0
解决办法
1244
查看次数

从 Intellisense 隐藏(抽象)类

我有几个抽象类是类库,它们想从 Intelisence 中隐藏,怎么做?

intellisense visual-studio-2010 c#-4.0

5
推荐指数
1
解决办法
1094
查看次数

点击测试矩形

我正在开发一个项目,我有几个矩形,我希望每个都有悬停效果.现在我知道我可以捕获WM_MOUSEMOVE消息并遍历每个矩形.但是,如果我有很多矩形(如果50很多),该怎么办?
我可能错了,但不会迭代那么多,并且每次鼠标移动缓慢应用程序一点点时测试每一个?

然后我开始想知道操作系统(例如windows)是如何做到这一点的,现在我的屏幕上有100多个东西,当我将鼠标悬停在它们上面时,它们都有某种动画.而且我不认为每次鼠标移动像素时窗口都会遍历所有窗口.

基本上:
1.如果我有大约50个矩形,我怎么能弄清楚我的鼠标在哪个矩形上面,并考虑到性能.
2. Windows如何做到这一点?(我对任何东西都更好奇,但如果它不复杂,也许我可以在我自己的程序中实现类似的东西?)

哦,它们都是矩形,它们不会旋转或任何东西.

c++ windows winapi hit detection

4
推荐指数
1
解决办法
3656
查看次数