1. 按键精灵多线程怎么写
多线程写法也很简单,而且容易看懂,修改参数比较简单
BeginThread A
Delay 10
BeginThread B
Delay 10
BeginThread C
Sub A()
While true
KeyPress "A", 1
For 10
Delay 1000
Next
Wend
End Sub
Sub B()
While true
KeyPress "B", 1
For 3
Delay 1000
Next
Wend
End Sub
Sub C()
While true
KeyPress "C", 1
For 7
Delay 1000
Next
Wend
End Sub
2. 按键精灵多线程怎么写
按键精灵是没多线程的,只有一个伪多线程。
推荐楼主使用TC简单开发软件,TC的多线程,才是程序里面真正的多线程。 开启多线程的优点和缺点 提高界面程序响应速度。
通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。 充分利用系统资源,提高效率。
通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。 当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用。
3. 在java中怎样写个多线程并发
多线程有两种形式,一种是直接让当前类继承 Thread 重写run方法来实现,另一种是使用 Runnable接口。推荐第二种方法。
例:
public class Counter {
public volatile static int count = 0;
public static void inc() {
//这里延迟1秒,使得结果明显
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
count++;
}
public static void main(String[] args) {
//同时启动1000个线程,去进行i++计算,看看实际结果
for (int i = 0; i
4. 求教一种正确的多线程写法
其实你的这个需求很容易达到.我先说一下我的废话吧..第二张数据库表OutDoor(字段:ID、name、CardId、time1,time2),此表记录固定(写死的)把他缓存到ASP.NET中然后监视AccessDoor表.或者在ADD方法中.添加代码当ADD时,拿出缓存,判断是否存在.打上标签..这样写.没有任何服务器压力SQL压力.实现你的内容..下面会给你解释些为什么要按照我这么做..下面都是按照你来的那种了哦~!线程,ASP.NET?我好奇你如果是IIS作为宿主,你是在APPLACTION级别写的代码么?我帮你解答,但并不推荐哦,因为IIS的线程池是有限的,具体详见,进程与线程的关系,如果想了解可以提问.先帮你回答你的问题吧如果你不知道把这些代码放在哪里,,那您就先应该温习线程在ASP.NET中如何使用以及C#的线程在ASP.NET中的使用注意事项。
我的下方所示代码均写在全局配置文件中哦.当然也可以写在C#的普通类文件,但是那时候我怕你控制不住线程.ASP.NET开线程的话给你提供三种备选方式1.thread t=new thread(yourMethon)T.START()YourMethon的外层结构为While()或DO WHILE()大概为While(true){//这里写你的代码..//OK.你要查询数据库,暂且叫他做CommentToDataBaseFunction//我就CommentToDataBaseFunction();//调用查询数据库Thread.CurrentTheard.Sleep(1000);.//防止在IIS串线程以及更好的控制线程,这么写是最推荐的我这里是手写了.不对的话你自己修改一下}2.使用ASP.NET中的Timer道理与上面一样,但是使用过程中特别注意别同时引用了两种Timer 我记不大清楚了,一个实在THREAD.TIMER,另外一个好象是WINFORMS的还有ASP,NET的都有一种是控件类型,一种是线程的基本版.如果是控件的话那么代码是Timer myTimer=new timer();哎呀..我承认这控件的构造函数忘掉了。哈哈Mytimer.时间=1000;//。
我丢人了..哈哈好吧.我非圣贤嘛。MytIMER.TICKER+=CommentToDataBaseFunction()3.既然是ASP.NET那肯定少不了WEB前台式的查询在web前台方式查询数据库那么分为两种起始道理一样,使用JS或JQ发送AJAX查询即可这两种的你去百度一下具体代码。
如果不知道你在问吧..下来是你的查询数据库代码CommentToDataBaseFunction该方法就简单了..发一条SQL即可..其实在我看来你的问题完全是模糊不清楚的该线程"每秒"扫描数据库表AccessDoor(字段:ID、name、CardId、time1,time2)(表数据已插入)并时刻返回数据记录、整个表么?如果是。你这玩意效率真心低了..OK..不扯淡..给你说具体..另外:表AccessDoor的查询记录与第二张数据库表OutDoor(字段:ID、name、CardId、time1,time2),此表记录固定(写死的)。
数据匹配,有相同项则返回1,否则返回0。按照你的PS内容,.你是想让我给你写SQL吧..OK。
SQL张这样哈..我仍旧伪代码了.Select *,(select case when exists(select*from OutDoor where 挨个写。. 字段)a then 1 else 0 end ) from AccessDoor好吧这样应该是可以滴..我网吧坐着呢..要是不行.你把提示给我.容我再燃烧燃烧大脑。
然后1存在0不存在多出来一个未命名字段..要命名的话你就AS一下就好了友情提示啊..IIS的线程归IIS进程所管,如果你长时间狂刷IIS的线程,你这么开开关关的..要是写在APPLACTION级别我倒还能接受那么一点点,如果你写在ASHX或者C#代码中,,如果你是我属下..我1000%抽你..因为除过APPLACTION级别以外..ASHX与C#均是以客户端的个数为单位的.大部分不懂.NET框架的人都说什么CLR.什么的.其实线程在真正的回收仍需要时间,,当然根据你硬件来讲..如果以客户端为单位假设开关100线程中实际存在的线程为101.那么1000个在线客户就可以达到10W线程.10W。这线程还不直属于WINDOWS还奴属于IIS进程。
.所以..你看着弄吧..如果是APPLACTION的话我倒也不反对,但是你的这个网站这一块就会造成实际的SQL连接池压力(前提是你不查询整个表如果查询整个表..你连接池占不满.你内存会占满)如果让我给你些建议的话..把代码写在APPLACTION级别,也就是那个什么GOLBX什么什么玩意的那么..写在APPLACTIONSTART的那个事件中,,然后写一个APPLACTION变量,将当前最新的ID查询出来,存进去.上面的SQL加一个WHERE 条件..ID>XXXX这样效率会高点.再高的话..你做缓存..或者在ADD时编写代码。
5. C# 如何写多线程程序
我用的是VS2005,
线程的实现可以用种方法..目前我知道的.一种是安全调用,一种是不安全调用
先说不安全调用
先加入命名空间 using System.Threading;
然后在要用新线程运行的方法中加入
Thread a=new Thread(new ThreadStart(sayhi());
然后用a.start();开始新的线程,执行的代码放到
private void sayhi()
{
Messagebox.Show("Hello New Threading");
}
这样运行的话,就算关了主界面,这个对话框也不会消失
如果想在这个新进程中改变主程序中的界面,则需要在改变前加入一句话
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
这样就可以在新的进程中操作主窗体的控件,比如label1.Text="Hello";
另一种方法是安全调用,不过VS2005中提供的BackgroundWorker,可以很方便的进行调用线程,同样,想通过新进程访问主程序的话 也是需要加入
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
BackgroundWorker控件很方便,
托一个到设计界面里,双击这个控件,然后会生成一个private void backgroundWorker1_DoWork(object sender,EventArgs e)事件
把新线程要做的工作写在下边的代码里
然后通过this.backgroundWorker1.RunWorkerAsync();调用DOWORK的代码
而且还可以用private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)可以做的收尾工作.
在BackgroundWorker的方法列表中有
6. c语言如何编写一个简单的多线程程序
这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,如下:/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。
缓冲区有N个,是一个环形的缓冲池。 */#include #include #define BUFFER_SIZE 16 struct prodcons { int buffer[BUFFER_SIZE];/*实际存放数据的数组*/ pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/ int readpos,writepos; /*读写指针*/ pthread_cond_t notempty;/*缓冲区非空的条件变量*/ pthread_cond_t notfull;/*缓冲区未满 的条件变量*/ };/*初始化缓冲区*/ void pthread_init( struct prodcons *p) { pthread_mutex_init(&p->lock,NULL); pthread_cond_init(&p->notempty,NULL); pthread_cond_init(&p->notfull,NULL); p->readpos = 0; p->writepos = 0; }/*将产品放入缓冲区,这里是存入一个整数*/ void put(struct prodcons *p,int data) { pthread_mutex_lock(&p->lock); /*等待缓冲区未满*/ if((p->writepos +1)%BUFFER_SIZE ==p->readpos) { pthread_cond_wait(&p->notfull,&p->lock); } p->buffer[p->writepos] =data; p->writepos++; if(p->writepos >= BUFFER_SIZE) p->writepos = 0; pthread_cond_signal(&p->notempty); pthread_mutex_unlock(&p->lock); }/*从缓冲区取出整数*/ int get(struct prodcons *p) { int data; pthread_mutex_lock(&p->lock); /*等待缓冲区非空*/ if(p->writepos == p->readpos) { pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notempty } /*读书据,移动读指针*/ data = p->buffer[p->readpos]; p->readpos++; if(p->readpos == BUFFER_SIZE) p->readpos = 0; /*设置缓冲区未满的条件变量*/ pthread_cond_signal(&p->notfull); pthread_mutex_unlock(&p->lock); return data; } /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/#define OVER (-1) struct prodcons buffer; void *producer(void *data) { int n; for( n=0;n { printf("%d ------>\n",n); put(&buffer,n); } put(&buffer,OVER); return NULL; } void *consumer(void *data) { int d; while(1) { d = get(&buffer); if(d == OVER) break; else printf("----->%d\n",d); } return NULL; } int main() { pthread_t th_p,th_c; void *retval; pthread_init(&buffer); pthread_create(&th_p,NULL,producer,0); pthread_create(&th_c,NULL,consumer,0); /*等待两个线程结束*/ pthread_join(th_p, &retval); pthread_join(th_c,&retval); return 0; }。
7. 如何学会多线程工作
转载这是一个很有意思的问题,我准备先介绍一下心理学上对这个问题的看法,然后从自己的思考和经验出发谈一谈应对之道。
的确,从认知心理学的观点来看,严格来讲人的「多线程工作」是不可能的。因为在任一个瞬间,人只能有一个「注意焦点」,这个注意焦点牵引了人的认知加工资源。
但有时你会误以为同时关注了两个东西,其实是发生了注意转移的结果,即焦点从一个对象转移到另一个对象上,实际上还是一个串行而非并行的过程。当然有一种例外是,有些很熟练的技能,可以「自动化」地、不加注意地进行,那么就可以和其他事情同时做。
比如你骑自行车,你的女朋友坐在后面笑,这时你的注意焦点保持在你女友身上,你和她聊天的同时,你的腿也在一刻不停地蹬,你不需要停下来是因为骑车不需要你的注意和认知资源。但如果此时突然前面蹿出一只喵星人,你可能立马就会把注意焦点给转移了。
当然题主烦恼的并非是这种「秒级」、「毫秒级」的「多线程」,而是指在一个「时期」内,会同时担负几种不同的工作,完成不同的任务,这就是另一种意义上的,不同任务之间需要切换的「多线程」。「任务切换(task switching)」也可以算认知心理学中的一个经典课题了。
心理学家早就发现,当你从任务A切换到任务B后,执行任务B的绩效要明显比非任务切换条件下执行B的绩效差,这个差异称为「切换代价(switching cost)」。切换代价的形成原因主要有两种,一是任务A留下的认知惯性,也就是我之前已经习惯了任务A的认知情境、反应方式,这个惯性会对完成任务B造成干扰,二是做B的时候需要对B进行认知重构,重新回忆起B的相关背景和信息,这个重构也需要时间,而且可能不完整。
可现实就是这样,虽然不论从心理学还是从我们的生活经验来看,这种需要任务切换的「多线程」的感觉很糟,效率很低,但我们往往没有选择:一个任务做到一半被打断,然后去做另一个任务,然后又被打断,又去做另一个……这里有个至关重要的事实是:如果你是在非常投入和忘我的思考时被打断,那么你的「损失」和懊恼就会非常大,相反,如果你只是在做抄写一篇文档这种不动脑子的活,那么即便是频繁的中断也不会对你造成太大的影响。所以,如果你能选择好合适的中断点,中断就并不可怕,切换的损失也可以降到最低,如果说多任务工作有什么技巧的话,那么这个技巧就是「对中断点进行控制和管理的技巧」。
这个技巧的前提是,我们需要对要完成的任务进行有效地剖析,区分出「容忍中断」的部分和「无法容忍中断」的部分,然后用可保证的相对完整的时间去施行那些「无法容忍中断」的部分。为此我提出了一般任务分解的「三明治模型」: 这是一个金枪鱼三明治,它有一个核心,就是金枪鱼肉泥,完成这个部分的努力我称为「核心思考区间」。
事实上大多数任务都有一个至关重要、通常也是最棘手的部分,这个部分需要我们集中精力、非常专注地进行思考,然后将其破解,一旦这个部分被我们「吃下」,那么这个任务就已经完成了大半,余下的就是一些支持性的、补完性的工作(即「支持性思考区间)和一些「体力劳动」(即「操作性动作区间」)了。 我自己工作中有一个习惯,就是拿到一个任务后,势必要先去找那个任务的核心思考区间,找到那块硬骨头,去啃下来,而不是先去做那些周边的打扫性的工作。
举个简单的例子,如果你现在接到一个做PPT的任务,你第一步准备做什么?是先挑一个漂亮的主题模板吗?不是。是马上去百度谷歌查资料吗?也不是。
正确的答案是:设计PPT的架构。即你要分析你的受众,他们的知识水平、理解水平以及兴趣点、关注点,在此基础上设计你的内容以及展现内容的顺序,先讲什么,占比多少,再讲什么,占比什么,以及讲的时候采取什么风格、策略,然后,PPT的架构就出来了。
这个实施过程就是该任务的「核心思考区间」,你不需要任何辅助,你只需思考,非常专注的思考,你要的工具,仅仅是一张纸和一只笔(你需要把你的灵感快速地记下来)。等你完成了这个过程,你可以选择继续填充具体的内容(「支持性思考区间」),也可以break一下,也可以去做别的工作,都无所谓。
之后,等你在为这件PPT选择模板、寻找配图或者调整字体的时候(「操作性动作区间」),你并不大会介意被打断,因为你知道,这个任务在某种意义上,你已经完成了。 不瞒你说,为了写这个答案,我用了半个小时的时间、一张A4纸和一只笔,用我纯粹的、专注的思考,来设计它的「架构」。
设计完成后,我吃了一顿晚饭,看了一集美剧,这个写作的中断并没有让我担心,因为我知道,即便我还没有在电脑上敲入一个字,这个答案,其实已经写完了。 这就是多线程工作的秘诀。
很多时候,你只是需要一个专注不受干扰的、能纯粹跳脱出来思考的、能达至「心流」状态的、能把最关键的「硬核」搞定的——半小时。 这个方法背后暗含着这样一个逻辑:当我们不得不对一个任务进行分段处理时,我们并不应机械地按照时间段来切分(「今天上午9点至10点做A,明天下午1点至3点继续做A」),而是应该按照这。
8. Java多线程的几种写法
有三种:
(1)继承Thread类,重写run函数
创建:
class xx extends Thread{
public void run(){
Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源
}}
开启线程:
对象.start() //启动线程,run函数运行
(2)实现Runnable接口,重写run函数
开启线程:
Thread t = new Thread(对象) //创建线程对象
t.start()
(3)实现Callable接口,重写call函数
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
①Callable规定的方法是call(),而Runnable规定的方法是run().
②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
③call()方法可抛出异常,而run()方法是不能抛出异常的。
④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等
待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果
9. c++如何写多线程,分一个线程来实时更新结果,具体如下
#include
#include
#include
volatile HANDLE waitForStart;
volatile HANDLE waitForResult;
volatile int result;
DWORD APIENTRY task(LPVOID* p)
{
for(;;)
{
WaitForSingleObject(waitForStart, INFINITE);
++result;
SetEvent(waitForResult);
}
return 0;
}
int main()
{
HANDLE thread;
result = 0;
waitForStart = CreateEvent(0, FALSE, FALSE, 0);
waitForResult = CreateEvent(0, FALSE, FALSE, 0);
thread = (HANDLE)_beginthreadex(0, 0, task, 0, 0, 0);
CloseHandle(thread);
for(;;)
{
SetEvent(waitForStart);
WaitForSingleObject(waitForResult, INFINITE);
printf("%d\t", result);
}
return 0;
}