我有一个System.Timers.Timer,它每隔3秒递增一次计数器.另一个线程也可以在某些条件下将此变量设置为任何值.
试图使用Interlocked.Increment,但它没有UInt16的重载.接下来要考虑的是锁定,但我不确定如何对此变量进行线程安全访问(读/写/增量).
编辑:代码最初使用int,但根据建议更改为UInt16
private volatile System.UInt16 mCounter = 0;
private readonly object mCounterLock = new object();
public System.UInt16 Counter {
get {
lock (mCounterLock) {
return mCounter;
}
}
set {
lock (mCounterLock) {
mCounter = value;
}
}
}
private System.Timers.Timer mCounterTimer;
void mCounter_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
lock (mCounterLock) {
Counter++;
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道组织将要进行单元测试的 C++ 项目和类的有效方法是什么。我读过很多与单元测试相关的帖子,但找不到实际的例子。
以下是我收集的一些方法:
方法A
方法B
方法C(来自Miguel)
哪种方式更合适呢?你有什么其他的建议?
在Visual Studio 2010中编译以下代码时会发生这种情况.我的问题是:如果函数返回局部变量的地址,C++编译器将发出警告,但为什么在返回本地变量的本地引用时不会发出警告?
它仍然是错误的(返回本地变量的本地引用),但只是编译器无法检测到它?检查'num'和'r'的地址表明它们共享相同的内存位置.
#include <iostream>
using namespace std;
int & intReference() {
int num = 5;
int &r = num;
cout << "\nAddress of num: " << #
//return num; // Compiler warning: C4172: returning address of local variable or temporary
return r; // No warning?
}
void main() {
int &k = intReference();
cout << "\nk = " << k; // 5
cout << "\nAddress of k: " << &k; // same address as num
char c;
cin.get(c); …Run Code Online (Sandbox Code Playgroud) 什么决定一个工具进入特定目录?作为一个例子,adb在工具/中,但已转移到platform-tools /.为什么他们不能住在同一个目录中?
我的项目使用UPnP协议打开端口.窗口在默认情况下禁用UPnP设备发现,需要打开网络发现在网络和共享中心启用UPnP设备的发现.
有没有办法以编程方式执行此操作?
我知道引用比指针更受欢迎,但改变所有那些"."是非常繁琐的.在需要时" - >".因此,总是使用指针而不是引用是一种可接受的做法,如果需要,可以轻松地将它们转换为智能指针吗?或者有没有办法快速更改指针的引用?
假设一个主窗体有几个菜单项.每个菜单项都会显示另一个表单.以下代码是在这种情况下进行依赖注入的好方法吗?
public class MainForm: Form {
private IAboutForm _aboutForm;
private IOptionsForm _optionsForm;
private IDownloadsForm _downloadsForm;
MainForm(IAboutForm aboutForm, IOptionsForm optionsForm, IDownloadsForm downloadsForm) { // add as many form dependencies as required
_aboutForm = aboutForm;
_optionsForm = optionsForm;
_downloadsForm = downloadsForm;
InitializeComponent();
}
private void AboutMenuItem_Click(object sender, System.EventArgs e) {
_aboutForm.ShowDialog(this);
}
private void DownloadsMenuItem_Click(object sender, System.EventArgs e) {
_downloads.Show();
_downloads.BringToFront();
}
}
Run Code Online (Sandbox Code Playgroud)