关于点击视窗的边框或标题 导致执行绪自动暂停-放開又正常繼續
c#吧
全部回复
仅看楼主
level 1
天草緋鞠 楼主
如题 我写1个执行绪
程式:
class SysHelper
{
public static TextBox _textbox;
delegate void PrintHandler(TextBox tb,string text);
public static void Run()
{
int x = 0;
while (true)
{
if (x % 1000 == 0)
{
Print(_textbox, x.ToString());
}
x++;
}
}
public static void Print(TextBox tb,string text)
{
if (tb.InvokeRequired)
{
PrintHandler ph = new PrintHandler(Print);
tb.Invoke(ph, tb,text);
}
else
{
tb.Text = tb.Text + text + Environment.NewLine;
}
}
}
public partial class Form1 : Form
{
Thread othread;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SysHelper._textbox = textBox1;
othread = new Thread(SysHelper.Run);
othread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
othread.Abort();
}
}
已经能正常工作
但是遇到一个很诡异的问题
点击视窗边框(会出现可拉长的)或标题(titlebar)
执行序回停住 滑鼠放开之后又继续正常印出
请问这个问题有什么可以解决的方法吗?
2016年02月20日 12点02分 1
level 1
天草緋鞠 楼主
已试过将
tb.Invoke(ph, tb,text); 改成 tb.BeginInvoke(ph, tb,text);
会造成整个视窗卡死错误
2016年02月20日 12点02分 2
level 11
好吧。我理解你的问题了。Print修改了UI,因此按理说是不允许在另一个执行绪上被呼叫的。所以必须使用tb.BeginInvoke。至于为何会卡死。因为PrintHandler调用了自身,而你又未改变tb.InvokeRequired的值,导致Print不断呼叫Print导致卡死,你的程式之所以不觉得卡是因为卡在另一个执行绪上你未能看出来。
2016年02月21日 05点02分 4
那有神么修改方法妈!? 执行续这方面叫不清楚 网路查到的也都只说把Invoke改成BeginInvoke....[泪]
2016年02月21日 05点02分
回复 秋色夏影 :改成tb.BeginInvoke(Print,_textBox,x.ToString())。你应该稍微了解一下北京话和台北话的区别,绝大多数吧友都受制于无法看懂台湾国语。
2016年02月21日 05点02分
明白。 是要改变while内部的Print?还是改变tb.InvokeRequired内部的?
2016年02月21日 06点02分
回复 天草緋鞠 :while内部的。
2016年02月21日 06点02分
level 7
试一试在
Run()函数中写 ph = new PrintHandler(Print);
委托写在类外面
创建static PrintHandler ph在SysHelper类里面
我不知道你这个程序怎么才算暂停- -因为我根本看不出来暂停。。TextBox那么老长
2016年02月21日 11点02分 6
1