【发布时间】:2012-02-18 10:33:30
【问题描述】:
我发现了一些关于我的问题的问题,但我仍然无法自己解决这个问题,所以我会尝试在这里提问。我把代码贴上来,这样我觉得会更容易解释。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Thread thread = new Thread(new ThreadStart(StartCalculation));
thread.Start();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void StartCalculation()
{
List<int> numbers = new List<int>();
for (int i = 0; i <= 100; i++)
{
numbers.Add(i);
string textForLabel = i.ToString();
label.SafeInvoke(d => d.Text = textForLabel);
}
}
}
- 我想从不同线程中启动的 StartCalculation 方法获得访问权限。我想从 Form1 访问该 int 列表(10 秒后有 10 个元素,20 秒后有 20 个元素,依此类推)。这可能吗?
- 是否可以在 Form1() 中创建列表,然后在 StartCalculation 中更改它? 感谢您的回答:)
为 Groo 编辑- / -
public partial class Form1 : Form
{
List<int> list = new List<int>(); // list of int values from game's memory
public Form1()
{
InitializeComponent();
Thread thread = new Thread(new ThreadStart(refreshMemory));
thread.Start();
Thread thread2 = new Thread(new ThreadStart(checkMemory));
thread2.Start();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void refreshMemory()
{
while (true)
{
// ... refresh game's memory and then, refresh list //
Thread.Sleep(100);
}
}
public void checkMemory()
{
while (true)
{
// eg. if (list[0] == 5) {game:: move_right()}//
Thread.Sleep(100);
}
}
}
我正在制作游戏机器人。我希望它在不同的线程(更改内存列表)中读取游戏的内存,然后使用其他一些方法(在不同的线程中)我想从该列表中读取并根据内存值执行游戏操作。它有效(或似乎有效),但如果你说它可能不安全,我想让它安全。
希望我没有把它贴在这里弄傻了。
【问题讨论】:
-
好的,谢谢!感谢那本书,现在解决了:)
-
“10 秒后 10 个元素,20 秒后 20 个元素” - 为什么会出现这些延迟?如果后台线程以更快的速度生成元素怎么办?或者这应该作为生产者/消费者队列工作,但阈值是最小值。 10 件?
-
@Patryk:如果您没有通过添加或删除项目(即更改其长度)来修改列表,那么简单地交换一个 int 值或不同的参考值是原子完成的,并且本身不会导致线程问题(事实上,任何涉及 32 位或更小的值的赋值在 .NET 中都是原子的)。但是游戏循环通常在单个线程中进行(读取输入 -> 计算新位置 -> 检查碰撞 -> 渲染)。你为什么坚持多线程?您需要一个线程用于循环,并使用主(gui)线程进行渲染。除此之外,您是否考虑过 XNA?
-
哦,现在我明白了。我以为你在做游戏。以及如何获取游戏内存数据,您是否正在读取不同进程拥有的内存?你已经处理过这部分了吗?有多种方法可以做到这一点。您发布的内容相当简单,取决于您的逻辑的复杂性,它可能就足够了。但我仍然相信您的线程可以在一次迭代中唤醒、获取内存、处理它并重新进入睡眠状态。稍后我可以发布另一个带有一些模式的答案,现在我有点忙。
标签: c# multithreading