小编Rad*_*094的帖子

Threadsafe foreach枚举列表

我需要枚举通用的IList <>对象.列表的内容可能会更改,如在其他线程中添加或删除,这将使用"已修改集合;枚举操作可能无法执行"来终止我的枚举.

在IList <>上做线程安全foreach的好方法是什么?最好的是没有克隆整个列表.无法克隆列表引用的实际对象.

c# multithreading

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

使用std :: sort查找std :: vector中的前N个项

我需要对a中的元素进行排序std::vector,但我只对N排序的顶级项目感兴趣,而不是整个列表:

例如,在10个元素的列表中,只需要对前3个元素进行排序.不关心其余的......

1,2,3,6,7,4,9,8,5

这可以用std::sort吗?

编辑

我只需要找到N矢量中的顶部项目.std::partial_sort_copy真是我需要的.

c++ sorting stl

8
推荐指数
2
解决办法
2734
查看次数

可靠的UDP和ACK方法问题

我正在阅读有关可靠UDP的实现(即发送ACK数据包并再次重新发送非确认数据包).

我似乎在网络中找到了两种主要模式:

  1. 客户端使用该数据包的序列为每个接收到的数据包发送ACK.除非收到ACK,否则服务器假定数据包未送达.

  2. 客户端发送一个ACK数据包,其中包含它认为缺失的数据包序列.服务器假定数据包已传递,除非它从客户端收到一条ACK,说它缺少序列,然后再次重新发送请求的(丢失的)数据包.

简而言之,在1.中,客户端发送接收到的数据包的序列,而在2.客户端发送丢失数据包的序列.

只是想知道每种方法的优点/缺点是什么,哪一种更主流(我假设1,但是2似乎是一种非常聪明的方法,因为大多数数据包确实到达而且通常只丢失一些).

编辑:两种方法的简短示例:

Method 1: Server sends: 1,2,3,4,5 
Client received: 1,3,5,4 
Client sends back: ACK 1, ACK 3, ACK 5, ACK 4  
Server resends: 2.. maybe more if ACK packets were lost


Method 2:
Server sends 1,2,3,4,5,6,7,8
Client receives: 1,3,2,5,7
Client Sends :ACK (lowest continuous 3,highest received 7,  seem to be missing 4,6)
Server resends: 4,6,8
Run Code Online (Sandbox Code Playgroud)

udp network-protocols unreliable-connection

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

history.back()不会更新Chrome/FireFox中的location.hash

我尝试构建一个可以更改页面位置的JS脚本,直到找到特定的哈希位置:

var StopAtThisHash ='#';
var CurrentHash = window.location.hash;
var continueLoop = true;
while ((window.history.length>0) && (continueLoop))
{
        window.history.back();
        var NowWeAreAtHash = window.location.hash; //this never changes in Chrome
        //actually, always seems to:  CurrentHash  == NowWeAreAtHash;
       if(NowWeAreAtHash == StopAtThisHash)
                        continueLoop= false;
}
Run Code Online (Sandbox Code Playgroud)

很奇怪,在Chrome和FF中,window.location.hash在back()之后没有改变.历史长度也没有像我预期的那样减少1.循环无限运行,浏览器挂起.

在IE 9中,这似乎按预期运行.

有没有解决方法呢?

javascript firefox google-chrome

7
推荐指数
1
解决办法
1281
查看次数

设置 display:block 后将焦点设置在输入元素上

我有一个 HTML,内容如下:

<div class="hiddenClass"> // this implies display:none
 <span>
    <input type="text" id="hiddenInput"/>
 </span>
</div>
Run Code Online (Sandbox Code Playgroud)

和一个 Javascript 事件(在 jQuery $.ajax() 调用的“succes”方法中触发),需要使该 div 可见,然后将焦点设置到该控件。就像是:

 this.DOMElements.divElement.className="showClass"; //a CSS class with display:block;
 this.DOMElements.hiddenInputElement.focus();
 this.DOMElements.hiddenInputElement.select();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这段代码只在部分时间有效。在某些情况下(仅有时!!),焦点/选择命令会生成有关聚焦/选择不可见控件的警告。控件将变得可见,但焦点不会移动,文本也不会被选择。

我(在某种程度上)找到了一个解决方案,将焦点/选择代码移动到一个单独的函数中,并通过以下方式延迟调用它:

this.DOMElements.divElement.className="showClass"; //a CSS class with display:block;
setTimeout("focusinput('hidddenInput')",1);
Run Code Online (Sandbox Code Playgroud)

好吧,最后我的问题是:由于 javascript 是单线程的。为什么在我使父 div 可见的时间和我可以在子输入元素上设置焦点/选择的时间之间存在延迟?这怎么可能是竞争条件呢?

编辑:发生在 IE8 中

javascript css multithreading

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

ScrollViewer高度在内容溢出页面时自动滚动

好吧,这听起来很傻,但我不能让ScrollViewer正常工作.我需要做的是

  1. 让Silverlight页面使用HTML页面的100%宽度/高度

  2. 在Sliverlight页面的顶部有一个高度= 160px的控件,然后其余的(100% - 160px)是一个动态更改内容的ScrollViewer.

所以在HTML页面中我有:

 <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
Run Code Online (Sandbox Code Playgroud)

然后在XAML中:

 <Grid x:Name="LayoutRoot" Height="Auto">
        <StackPanel Orientation="Vertical" Height="Auto">        
            <App:ASilverlightControl  x:Name="Header" Height="160"/>
            <ScrollViewer Name="svw"  HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible"  Height="Auto" >
                <StackPanel Orientation="Vertical" x:Name="DynamicContentHere">
              </StackPanel>                                                
            </ScrollViewer>
       </StackPanel>    
   </Grid>
Run Code Online (Sandbox Code Playgroud)

现在,无论我尝试什么,ScrollViewer总是会扩展/收缩以包含StackPanel中的所有元素,即使这意味着在屏幕下溢出但没有垂直滚动条.

我能让它工作的唯一方法是将高度= 800设置为ScrollViewer.

silverlight xaml

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

.NET中的只读字段是否可以为空?

我在多线程应用程序中有一个奇怪的错误:

public class MyClass
{
   private readonly Hashtable HashPrefs;
   public MyClass(int id)
  {
     HashPrefs = new Hashtable();
  } 

  public void SomeMethodCalledFromAnotherThread(string hashKey,string hashValue)
 {
    if (HashPrefs.Contains(hashKey))  // <-- throws NullReferenceException
    {

    }
 }
}
Run Code Online (Sandbox Code Playgroud)

一个主题是:

 SomeQueue.Add(new MyClass(1));
Run Code Online (Sandbox Code Playgroud)

而另一个线程做的是:

 SomeQueue.Dequeue().SomeMethodCalledFromAnotherThread(SomeClass.SomeMethod(),"const value"); 
Run Code Online (Sandbox Code Playgroud)

但是第二个线程如何在构造函数完成之前调用该方法?

编辑:我添加了带有函数参数的部分,因为它似乎可能是相关的.据我所知,传递的hashKey不能为null,因为SomeMethod()总是返回一个相关的字符串.

正如其他人所指出的,如果问题是传递给Contains()的null haskKey参数,则异常将是ArgumentNullException.

c# multithreading

6
推荐指数
2
解决办法
2449
查看次数

mod_mono和Apache上的Appdomain回收设置

如何控制mod_mono和Apache上运行的ASP.NET应用程序的应用程序回收设置?

在IIS6和7上,当AppDomain被回收并且应用程序基本上执行Application_End()/ Application_Start()时,可以选择指定时间段,多个请求等.

我在mod_mono和Apache上看到了相同的行为,但我无法找到更改设置的位置.

apache asp.net mono mod-mono

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

没有锁的独立物理线程

我有一个经典的物理线程与图形线程问题:

假设我正在运行一个用于物理更新的线程和一个用于渲染的线程.

在物理线程(伪代码)中:

while(true)
{
  foreach object in simulation

     SomeComplicatedPhysicsIntegration( &object->modelviewmatrix);
     //modelviewmatrix is a vector of 16 floats (ie. a 4x4 matrix)
}
Run Code Online (Sandbox Code Playgroud)

并在图形线程中:

while(true)
{
  foreach object in simulation
    RenderObject(object->modelviewmatrix);
}
Run Code Online (Sandbox Code Playgroud)

现在理论上这不需要锁,因为一个线程只写入矩阵而另一个只是读取,而我并不关心陈旧数据.

更新矩阵的问题不是原子操作,有时图形线程只会读取部分更新的矩阵(即并非所有16个浮点数都被复制,只有部分浮点数),这意味着矩阵的一部分来自一个物理帧, part来自前一帧,这反过来意味着矩阵不再是仿射(即它基本上已被破坏).

有没有好的方法可以在不使用锁的情况下防止这种情况 我读到了使用双缓冲的可能实现,但我无法想象一种在不同步线程的情况下工作的方法.

编辑:我想我真正想要使用的是某种三重缓冲,就像他们在图形显示器上使用的那样......有人知道三重缓冲算法的良好表现吗?

编辑2:确实使用非同步三重缓冲不是一个好的想法(如下面的答案所示).物理线程可以运行多个循环,占用大量CPU并停止图形线程,计算最终从未渲染过的帧.

我选择了一个带有单个锁的简单双缓冲算法,其中物理线程在交换缓冲区之前仅在图形线程之前计算多达1帧.像这样的东西:

物理:

while(true)
{
  foreach physicstimestep
   foreach object in simulation    
      SomeComplicatedPhysicsIntegration( &object->modelviewmatrix.WriteBuffer);
  LockSemaphore()
  SwapBuffers()
  UnlockSemaphore()
}
Run Code Online (Sandbox Code Playgroud)

显卡:

 while(true)
    {
     LockSemaphore()
      foreach object in simulation
        RenderObject(object->modelviewmatrix.ReadBuffer);
     UnlockSemaphore()
    }
Run Code Online (Sandbox Code Playgroud)

听上去怎么样?

c++ multithreading

6
推荐指数
2
解决办法
1906
查看次数

在.aspx文件中进行条件编译

我需要.ASPX文件基于条件编译符号表现不同.

让我们说一个简单的例子:

<%@ Control Language="C#" AutoEventWireup="true" (...) %>
<% #ifdef DEBUG %>
     <asp:SomeDebugControlHere runat="server"/>
     .. well .. a LOT of code here
<% #else %>
    <asp:SomeReleaseControlHere runat="server"/>
    .. and a LOT of other code here
<% #endif %>
Run Code Online (Sandbox Code Playgroud)

后来编辑:更多澄清.问题是SomeDebugControlHere类甚至没有在发布版本中定义(它在现实生活中更复杂,但是请注意这个例子).所以在page.aspx.designer.cs中我需要在调试版本中得到它:

/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.SomeDebugControlHere myControl
Run Code Online (Sandbox Code Playgroud)

这在发布版本中:(并且从不都是)

/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks> …
Run Code Online (Sandbox Code Playgroud)

asp.net

5
推荐指数
2
解决办法
3103
查看次数