我需要枚举通用的IList <>对象.列表的内容可能会更改,如在其他线程中添加或删除,这将使用"已修改集合;枚举操作可能无法执行"来终止我的枚举.
在IList <>上做线程安全foreach的好方法是什么?最好的是没有克隆整个列表.无法克隆列表引用的实际对象.
我需要对a中的元素进行排序std::vector,但我只对N排序的顶级项目感兴趣,而不是整个列表:
例如,在10个元素的列表中,只需要对前3个元素进行排序.不关心其余的......
1,2,3,6,7,4,9,8,5
这可以用std::sort吗?
编辑
我只需要找到N矢量中的顶部项目.std::partial_sort_copy真是我需要的.
我正在阅读有关可靠UDP的实现(即发送ACK数据包并再次重新发送非确认数据包).
我似乎在网络中找到了两种主要模式:
客户端使用该数据包的序列为每个接收到的数据包发送ACK.除非收到ACK,否则服务器假定数据包未送达.
客户端发送一个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) 我尝试构建一个可以更改页面位置的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中,这似乎按预期运行.
有没有解决方法呢?
我有一个 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 中
好吧,这听起来很傻,但我不能让ScrollViewer正常工作.我需要做的是
让Silverlight页面使用HTML页面的100%宽度/高度
在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.
我在多线程应用程序中有一个奇怪的错误:
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.
如何控制mod_mono和Apache上运行的ASP.NET应用程序的应用程序回收设置?
在IIS6和7上,当AppDomain被回收并且应用程序基本上执行Application_End()/ Application_Start()时,可以选择指定时间段,多个请求等.
我在mod_mono和Apache上看到了相同的行为,但我无法找到更改设置的位置.
我有一个经典的物理线程与图形线程问题:
假设我正在运行一个用于物理更新的线程和一个用于渲染的线程.
在物理线程(伪代码)中:
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)
听上去怎么样?
我需要.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)