主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];

向下

TThread:如何创建自己的信号对象? 找到类似的分支


lipskiy   (2002-03-20 21:46) [0]

人民! 我只是不知道如何做到这一点。
我有一个流,可以通过Internet更新数据。
我创建它,进行一些初始化,然后运行DialUp。 我需要等待连接建立。 DialUp组件有一个OnConnect事件-发生此事件时,我需要继续执行线程。
很明显,您需要使用WaitForSingleObject,但是它需要一个Handle,但是我在哪里可以得到它? 就是说,如何获取Handle OnConnect事件,等等。
如果您可以回答-请先详细介绍我,这是我第一次参加直播。



lipskiy   (2002-03-20 21:56) [1]

您会在哪里读到任何关于假人和俄语的内容?



vuk   (2002-03-20 21:56) [2]

将创建一个事件同步对象(请参见CreateEvent),并将其句柄传递给线程和将其唤醒的对象。 在正确的时间,只需调用SetEvent。

有时,为方便起见,可以使用TEvent包装器类。



vuk   (2002-03-20 22:00) [3]

您可以在Richter阅读。 一切都画得很好。



lipskiy   (2002-03-20 22:03) [4]

2 vuk
蒙娜丽莎对“已读”的引用吗?



Набережных С.   (2002-03-20 22:03) [5]

这里不需要WaitFor ...只需声明一个设置为OnConnect的全局标志,然后在流中写入类似的内容
标志:= false; DialUp.Open; 虽然不是Flag做的;



vuk   (2002-03-20 22:05) [6]

老实说,我没有链接。 :o(仅预订。



Suntechnic   (2002-03-20 22:06) [7]

用英语,我可以扔整本书。 除非在单独的章节中,否则在互联网上的俄语中,您不可能找到全部内容...



Suntechnic   (2002-03-20 22:09) [8]

> Naberezhnye S.(20.03.02 22:03)
不,不 这里的复选框是不合适的。 在等待期间,类似的线程将“消耗”资源。 而且,我们需要使其处于等待状态而又不消耗系统资源。 为此,使用了同步对象和Wait函数。



Набережных С.   (2002-03-20 22:14) [9]

不过,也许有必要澄清一下:
如果没有终止则不标记,然后释放资源并退出流。



Набережных С.   (2002-03-20 22:19) [10]

> Suntechnic©(20.03.02 22:09)

除非提高优先级,否则不会有特殊的“怨恨”。 但是,在DialUp.Open之后,您只需执行Syspend,然后在OnConnect上再次唤醒即可。



Набережных С.   (2002-03-20 23:19) [11]


>嘴唇©

给我看看流程代码,以防万一,否则我现在就建议您...



Suntechnic   (2002-03-20 23:54) [12]

> Naberezhnye S.(20.03.02 22:19)

标志:= false; DialUp.Open; 虽然不是Flag做的;

>如果不取消优先权,将没有特殊的“ pohozhrazhstva”。

首先,据我了解,连接是与更新数据的线程异步建立的。 这意味着未从该线程调用DialUp.Open。 其次 特别 不会有“不满”;会有定期的不满。



Набережных С.   (2002-03-21 00:01) [13]


> Suntechnic©(20.03.02 23:54)


>未从此线程调用DialUp.Open

那又怎样?

>会有普通的食物

如果重要的话,可以放入睡眠模式。



Suntechnic   (2002-03-21 00:23) [14]

> Naberezhnye S.(21.03.02 00:01)
嗯?
?

>如果重要的话,可以放入睡眠。

这是不可能的。 因为睡眠不知道何时建立连接。 您要撒多少水? 在10莫斯科时间? 在1分钟? 也许一个小时?....在Sleep调用期间,线程将只是休眠而不是工作。 长时间发明的轮子没有什么可以重新发明的...



lipskiy   (2002-03-21 01:14) [15]

人民! 谢谢大家,弄清楚了,它奏效了。
从该流中调用DialUp.Open,因为此类的实例本身是与该流一起创建的。
我同意在复选框上放一个循环不是很好,特别是因为DialUp组件在流中起作用,所以它需要资源。
根据建议,使用WaitForSingleObject和CreateEvent,SetEvent进行 武克,这要感谢他,一切都会按预期进行。 确实很舒服。

我还有一个问题。
所以我在一个线程中做这样的循环:
一会儿 (WaitForSingleObject(EventConnectSuccessfull,1000)<> WAIT_OBJECT_0) 和(TimeOut <> 0)做...

在这里,EventConnectSuccessfull是我的信号设备,TimeOut是第二个计数器,该计数器递减,这样它在拨号过程中就不会挂起。

因此,我不必拥有一个信令设备,而是拥有两个不同的信令设备。 并都检查此循环。 一个-EventConnectSuccessfull-例如成功的连接,另一个-EventConnectFailed-失败。
在这种情况下,如何正确编写循环条件?
如果我这样做:
一会儿 ((WaitForSingleObject(EventConnectSuccessfull,1000)<> WAIT_OBJECT_0) 或(WaitForSingleObject(EventConnectFailed,1000)<> WAIT_OBJECT_0)) 和(TimeOut <> 0)做...
然后,据我了解,将依次需要两个信令设备-每个都需要一秒钟,而我一次需要两个。 还是这样吗?
但是-当您退出周期时如何知道哪个警报设备起作用了?






Suntechnic   (2002-03-21 02:19) [16]

在我看来,您太聪明了。 为什么在这里需要他? 为了不永远嫉妒,使用第二个参数。 那你为什么需要 正是在这个地方,它也不是绝对必要的。 否则,您需要查看所有要说的最终代码...如果您需要等待几个事件,则可以使用 WaitForMultipleObjects的尽管我不太确定这里是否需要她。 您需要查看所有逻辑。



vuk   (2002-03-21 03:20) [17]

关于两个同步对象。 我认为在这种情况下绝对没有必要。 毕竟,总是可以从负责连接的组件中找到连接/非连接的状态。

在WaitForXXXObject中等待时,您可以设置超时
等待(该功能的第二个参数,如Suntechnic所指出的),这样就不需要额外的计数器。
如果没有终止, 的情况下的WaitForSingleObject(句柄,超时) WAIT_OBJECT_0:<等待>; WAIT_TIMEOUT:<超时处理>; 别的 <错误处理> 结束

尽管说实话,有时还是最好“唤醒”并检查终止标志的状态,否则,如果尝试终止线程,则该线程将在超时到期前“挂起”。

但是,如此超时的倒数计时会遇到一些困难。 有三种解决方法:

1。 一个计时器,用于计算超时之前的时间。 在这种情况下,您必须定期“唤醒并查看时钟”以及终止标志。

2。 如果事情在NT / W2K / XP中发生,则另一个同步对象是WaitebleTimer。

3。 不是通过终止标志集来终止流,而是通过另一个事件“ y”来终止流。

我最喜欢的最后选择。 这大约导致以下代码:
变种 句柄:THandle的数组[0..1]; ... 句柄[0]:= evtTerminate; 句柄[1]:= evtWake; 如果没有终止的话 的情况下的WaitForMultipleObjects(2,@ Handles,false,超时) WAIT_OBJECT_0:<结束线程>; WAIT_OBJECT_0 + 1:<等待>; WAIT_TIMEOUT:<超时处理>; 别的 <错误处理> 结束



Набережных С.   (2002-03-21 03:38) [18]


> Suntechnic©(21.03.02 00:23)

这是可能的。
虽然不是Flag做
如果未终止则休眠(0)
否则......
资源-事件也是资源。



Suntechnic   (2002-03-21 03:42) [19]

> Naberezhnye S.(21.03.02 03:38)
>资源事件也是资源。

我不会向任何人证明任何东西,更显而易见的是。 但我建议您在就此问题向任何人提供建议之前仔细研究一下这个主题...



Набережных С.   (2002-03-21 03:52) [20]

我已经很长时间了,对这个主题非常熟悉。 事情确实很明显。



Suntechnic   (2002-03-21 03:58) [21]

> Naberezhnye S.(21.03.02 03:52)
太好了

最后只有一个提示。 将您的想法变为现实。 运行测试用例,然后查看任务管理器,程序将消耗多少处理器时间。 您查看它,然后更改此问题的外观...



lipskiy   (2002-03-21 11:59) [22]

我自己的变量TimeOut包含一个完整的超时,例如-60秒(如果没有连接)-停止。 通过减少while循环中的每一秒,我将剩余时间打印到主窗体中,这需要一个循环。

从DialUp组件中,您可以获得连接/不连接事件,但是我不知道是否可以通过参数引发警报? 现在,我仅将全局标志(此信号设备出现的结果)与连接或不连接相加。 但我真的不喜欢。

在这里,由vuk©(21.03.02 03:20)提出的带有WaitForMultipleObjects的变量我只是不知道,我认为它将成功。

虽然,如果您仍然可以使用参数激励一个信令设备,那么它将更加方便(嗯,类似于SetEvent(True)或SetEvent(False)之类的东西)。 所以你做不到吗?




Набережных С.   (2002-03-21 14:56) [23]


> Suntechnic©(21.03.02 03:42)

我不知道继续下去是否有意义,但我仍然会回答。 有这样的事情-挤出多任务处理。 它在NT中完全实现,在9X中几乎完全实现。 任何线程将获得与操作系统根据其优先级提供的时间一样多的处理器时间。 如果目前没有其他活动线程,它将获得所有处理器时间(减去内核成本)。 如果有,他将获得自己的份额。 在考虑中的情况下,它不会对系统或应用程序产生任何明显的影响,并且不会“消耗”任何资源,尤其是因为它启动了几分钟。
估计服务器中当前有多少个活动线程(我们通过该线程进行通信)以及这如何影响单个客户端的响应时间。
PS仅查看任务管理器还不够,您仍然需要了解所见内容的含义。


>嘴唇©

如果您在9x下工作,请谨慎使用WaitFor ...,不要超时。 我已经有一段时间没有与9x有任何关系了,但是我记得,与NT相比,使用XNUMXx进入无法逾越的死胡同要容易得多。
唯一的出路只能通过“魔幻三”,甚至是复位。



Suntechnic   (2002-03-21 15:38) [24]

> Naberezhnye S.(21.03.02 14:56)
你无法理解一件事。 流向 NOTHING 除了等待事件外,它什么都没做,而且处理器时间根据整个程序而耗费时间(任务管理器将向您演示)。 不,当然可以,但是为什么? 如果可以使流在事件发生之前就简单地进入睡眠状态,那么它就不会假装什么。

在考虑中的情况下,它不会对系统或应用程序产生任何明显的影响,并且不会“消耗”任何资源,尤其是因为它启动了几分钟。
估计服务器中当前有多少个活动线程(我们通过该线程进行通信)以及这如何影响单个客户端的响应时间。


这是在纳申斯基。 就像在开玩笑说:“ ...我看着地图,那个库班多少钱...”

PS我有这种天性,即使他们不想要,我也会尝试睁开眼睛。 我们可能必须以此结束...



lipskiy   (2002-03-21 15:40) [25]

>我不知道继续下去是否有意义
有! 我总是阅读我的分支机构的文章,而不是我的文章,但是那些感兴趣的人-我也总是很高兴看到新的信息。

我在Win2k下工作,但是该程序应该可以在任何操作系统下正常运行-它可以通过Internet自由分发。 “工作”是指仅“写入”,还是一般在哪里可以启动它?

我将超时设置为1000(第二​​个参数是WaitForSingleObject,对吗?),所以它不应卡住。

卡萨蒂,这是我遇到的另一个问题,我在某个地方问过,但是我的话题没有得到答案。 如何确保线程已死? 毕竟,它不能通过代码在任何地方显示任何内容,并且通常不能以视觉方式显示自身,因为确信该流已被杀死?



Aleksandr   (2002-03-21 15:40) [26]

抱歉,同事,我在这里没听到这个话题...
也就是说,如果在我的程序中有这样的主体流:

重复
如果FoundWork的话
DoSomething的;
睡眠(2000)
直到终止; </>
那么他们会吃掉资源吗?



Digitman   (2002-03-21 15:46) [27]

>亚历山大
你觉得呢?
程序是什么? 是否需要处理器时间来遵循构成它的说明?



Suntechnic   (2002-03-21 15:48) [28]

> Aleksandr©(21.03.02 15:40)
在您的选择范围内,他将在2秒内不执行任何操作。

为了说明这是否有意义,有必要查看任务的条件。 在唇滑的情况下,将描述这种情况。

> lipskiy©(21.03.02 15:40)
>如何确保线程已死?
GetExitCodeThread 尝试过吗?



Aleksandr   (2002-03-21 15:53) [29]

2 Digitman
我的意思是,如果发生停机(即DoSomething失败),它将消耗资源吗?



vuk   (2002-03-21 15:54) [30]

到亚历山大·亚历山大(Aleksandr):
这完全取决于我们看不到的代码(FoundWork和DoSomething)。 但是您的视频流完成必须至少等待2秒。



Aleksandr   (2002-03-21 16:03) [31]

听着,也许我会给您完整的模块代码,并在专家的帮助下告诉我,轴在哪里悬挂?



lipskiy   (2002-03-21 16:15) [32]

>您是否尝试过GetExitCodeThread?
:))哇。 不,但是它是什么以及如何使用?

我的意思也有所不同-与程序无关,但总体而言。 例如,我退出程序,我如何知道线程也被杀死了?
然后我听说他可以呆在那里。



Suntechnic   (2002-03-21 16:38) [33]

> lipskiy©(21.03.02 16:15)
> :))哇。 不,但是它是什么以及如何使用?
并试图打开帮助? ;)

>例如,我退出程序,我如何知道该线程已被杀死?
然后我听说他可以呆在那里。

解释一下“离开程序”一词,那么也许他们会告诉您,也许还有什么挂起或不挂...。




Набережных С.   (2002-03-21 17:16) [34]


> Suntechnic©(21.03.02 15:38)

我对一切都很了解。 但是事实是,在这种情况下,这些成本没有任何实际价值。 无论如何,syspend c resume都将关闭该主题。
另一方面,事件的创建和支持是非常特定的系统资源的非常特定的成本。 但是在这种情况下,这些成本并不重要。 在这种情况下,没有一种解决方案比其他解决方案具有真正的优势。

听着,让我们结束话题。 累了 抱歉,如果我碰到东西,我不想。

lipskiy©(21.03.02 15:40)

>“工作”仅指“写”或一般
>它可以在哪里运行?

在哪里启动。

>然后我听说他可以呆在那里。

不会留下。 在NT下,所有输出流都将关闭,在9x下有冻结的风险。
通常,要找出任何OS对象的状态,需要使用它的句柄。



lipskiy   (2002-03-21 17:23) [35]

>并试图打开帮助? ;)
我试过了,它不起作用:)
但是说真的,我不会英语,所以帮助总是存在问题。 在阅读Pascal的操作员的水平上的英语知识仅允许以一般的术语来获得关于该主题的想法。

>“退出程序”
好吧,卸下它,我还能怎么走? 关闭完成或终止,或有区别,如何完成?
一次,我看到一个扫帚也随机地用线程戳了一下,制作了自己的形式来显示流的结果,当它完成主程序时,流形式仍然悬而未决-某些数据仍在不断更新。 此外,它是从IDE下启动的,通常可以完成程序运行,没有错误和问题,并且线程可以正常工作。
仅通过任务管理器杀死。



panov   (2002-03-21 17:26) [36]

> Aleksandr©(21.03.02 15:40)
否,在睡眠(2000)运行时,该程序将不会占用资源。
> Naberezhnye S.(21.03.02 17:16)
另一方面,事件的创建和支持是非常特定的系统资源的非常特定的成本。
活动的创建和支持-确实使用资源。
但是,使用这些资源并不像使用处理器时间那么重要。 我什至会说-这 абсолютно 不同的东西。

> Aleksandr©(21.03.02 16:03)
听着,也许我会给您完整的模块代码,并在专家的帮助下告诉我,轴在哪里悬挂?

不要。

如果您有问题,请在单独的线程中提问。



Набережных С.   (2002-03-21 18:03) [37]


> lipskiy©(21.03.02 17:23)

卸载程序意味着释放它占用的内存。 流的可执行代码是程序代码的一部分,如果代码不在内存中,则无法执行。 如果线程继续执行,则不会卸载程序。



lipskiy   (2002-03-21 18:21) [38]

2 Quay S.
是合乎逻辑的。 也就是说,如果我的执行者不在进程列表中,则为stopudovo,也没有流程。
这就是我需要找出的。 谢谢啦



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];

楼上









内存:0.73 MB
时间:0.044 c
4-366
JAndrey
2002-01-31 01:18
2002.04.01
如何在启动时自动运行?


1-204
Serzhzhzh
2002-03-20 10:49
2002.04.01
在MonthCalendar中选择多个日期


3-74
用户ppp
2002-03-10 14:02
2002.04.01
非常需要! 不要拒绝!


1-144
海豚
2002-03-22 02:25
2002.04.01
如何确定服务器上是否有文件。


4-345
Di_wind
2002-01-30 20:20
2002.04.01
TerminateProccess





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский