1. 小视频教程 > 知识库 >

resumethread,c++ 创建线程用CreateThread后,线程直接就开始执

本文目录索引

1,c++ 创建线程用CreateThread后,线程直接就开始执行了吗?还是还要再给它一个命令才能执行?

//CreateThread函数的参数原型如下
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize, // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress, // thread function
  LPVOID lpParameter, // thread argument
  DWORD dwCreationFlags, // creation option //这里指明建立后的线程是挂起还是直接运行
  LPDWORD lpThreadId // thread identifier
  );

//dwCreationFlags 有几个先项
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,这时候你需要调用resumethread()函数来手段将其释放,才能执行线程
(2)0:表示创建后立即激活。 这时候创建的线程会马上进入到任务等待队列,等待执行。
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!http://tieba.baidu.com/f?ie=utf-8&kw=0x30

c++ 创建线程用CreateThread后,线程直接就开始执行了吗?还是还要再给它一个命令才能执行?

2,线程挂起和恢复的几种方法

线程的挂起与恢复,不推荐使用Thread..::.Suspend
和Thread..::.Resume方法。你可以通过AutoResetEvent
来控制挂起和恢复,用Sleep来暂停线程执行。
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的
WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为
true;否则为 false。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。
class Class1
{
public static bool ok = false;
static AutoResetEvent are = new AutoResetEvent(false);
public void add() {
while(true){
if (ok)
{
Console.WriteLine("你好");
Thread.Sleep(1000);
}
else {
Console.WriteLine("我等待");
are.WaitOne();
}
}
}

public static void begin(){
ok = true;
are.Set();
}

public static void end()
{
ok = false;
}
}

class Program
{
public static void Main(String[] args) {
Thread t = new Thread(new ThreadStart(new Class1().add));
Thread.CurrentThread.Name = "主线程";
t.Start();
t.Name = "Class1线程";
for (int i = 0; i < 10;i++ )
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.begin();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.end();
t.Abort();
Console.WriteLine(t.Name + "状态:" + t.ThreadState);
Console.ReadLine();
}
}

3,怎么暂停和恢复一个线程呢

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.ArrayList;

import java.util.Properties;

import java.util.Scanner;

public class test implements Runnable

{

Thread t = new Thread(this);

public static void main(String[] args) {

test t1 = new test();

t1.t.start();

boolean flag = true;

Scanner sc = new Scanner(System.in);

while (true) {

//这里的2改成空格

if(sc.nextLine().equals("2")&&flag)

{

//暂停

t1.t.suspend();

flag = false;

}

if(sc.nextLine().equals("2")&&!flag)

{

//线程恢复

t1.t.resume();

flag = true;

}

}

}

@Override

public void run() {

while (true) {

try {

System.out.println("hello");

Thread.sleep(500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

4,在C中如何让线程暂停/恢复/终止

暂停线程必须想一个办法在能控制线程在能暂停的地方暂停,暂停点不能有任何数据已经上锁,上面说的那种while循环中也不能被暂停,还有一种就是当有大量内存被申请且还没有释放之前最好也不要被暂停。我建议大家用手动模式的信号量来实现。像这样申请一个信号量:
hEvent=::CreateEvent(NULL,TURE,TURE,lpName);//第二个参数是TURE,设定为手动模式,防止::WaitForSingleObject改变信号量的状态。

5,请教个pthread_setspecific的用法问题

pthread_getspecific和pthread_setspecific是设置线程私有的全局变量的。对于不是非常复杂的工程,这样做的意义并不是很大。全局变量并不一定就那么不好,有弊也有利,线程间共享数据很方便,用线程锁控制下读写也不会有什么问题。估计你的工程也不会是各自互相独立运行的吧?条理清晰点的话,把各自线程的相关代码放一个文件里就完事了。
如果万一假设非要用这个东东的话,你的用法也是有问题的,你可以这样认为,set是把一个变量的地址告诉key,一般放在变量定义之后,get会把这个地址读出来,然后你自己转义成相应的类型再去操作,注意变量的有效期。只不过,在不同的线程里可以操作同一个key,他们不会冲突,比如线程a,b,c set同样的key,分别get得到的地址会是之前各自传进去的值。这样做的意义在于,可以写一份线程代码,通过key的方式多线程操作不同的数据。估计你不是这个意思吧。

6,(C++多线程问题)CreateThread()函数问题

一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。 二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤: 1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回 2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1 3.分配context结构 4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD 5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数 6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数 三、MSDN中CreateThread原型: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD SIZE_T dwStackSize,//initialstacksize LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction LPVOID lpParameter,//threadargument DWORD dwCreationFlags,//creationoption LPDWORD lpThreadId//threadidentifier ) processthreadsapi.h中CreateThread原型: WINBASEAPI _Ret_maybenull_ HANDLE WINAPI CreateThread( _In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_SIZE_T dwStackSize, _In_LPTHREAD_START_ROUTINE lpStartAddress, _In_opt___drv_aliasesMemLPVOID lpParameter, _In_DWORD dwCreationFlags, _Out_opt_LPDWORD lpThreadId ); 四、示例:

7,C++程序,下面这个程序中.是创建仿真线程后,线程就直接开始运行吗?

1
假设上面的代码在主线程,BusThreadProc是子线程,可以在子线程需要访问全局资源之前加WaitForSingleObject阻塞,主线程中调用SetEvent.
2
线程创建成功后,只要cpu时间片轮到子线程,就会开始执行.
3
线程,事件等等都是内核对象,简单说就是句柄,一种资源,使用之后要释放.
并不是刚创建就关闭线程,是你的代码这么写的,closehandle可以放在你认为合适的位置,根据实现需求来.

8,c语言 windows程序

int c;

FILE *file;

file=fopen("d:\\test.txt","r");//只读方式打开

TCHAR str[1024]={0};

char *p;

p=str;

if(file!=NULL)//文件打开成功的话

{

while((c=fgetc(file))!=EOF)//从文件中读取字符,直到读到文件尾

{

*p=c; //将读到的字符写入前面申请的字符数组str中

if('\n'==*p)//如果遇到文件中的换行符

{

*p='\r';//向str中写一个回车符

p++;

*p='\n';//向str中写一个换行符

}

p++;

}

}

fclose(file);//关闭文件

SetDlgItemText(hwnd,IDC_EDITNOTEPAD,str);//将字符数组str中的内容写到IDC_EDITNOTEPAD所对应的控件中去

}

break

总体来说就是从文件中读出数据,把数据再写到IDC_EDITNOTEPAD对应的控件中

9,易语言程序,为什么在游戏打开的时候,只在进程里有显示,无弹出界面,关掉游戏后,能打开

如果你只是想知道怎么做到的话,下边给你分解一下: 首先,如果先启动易语言程序,后启动游戏的话,(此时若是易语言程序界面自己消失,一般是程序里用到 “时钟组件” 来监视有没有游戏进程打开) 有游戏进程的时候,易语言程序里可用代码将自己的:“可视属性” 调为假,所以你就看不到界面了(当然也有其他办法),反之,则将自己的“可视属性”调为 真! 希望这个回答能帮到你!

10,易语言怎么判断游戏结束工具也跟着结束

首先要取出系统列表,然后将游戏进程名和进程列表进行对比,如果进程存在,则不采取操作,不存在,就销毁软件窗口.需时钟组件配合使用.无模块代码: .版本 2.支持库 eAPI.子程序 __启动窗口_创建完毕时钟1.时钟周期 = 500.子程序 _时钟1_周期事件.如果真 (取反 (进程是否存在 (“E.exe”))) 结束 ().如果真结束.子程序 进程是否存在, 逻辑型.参数 进程名, 文本型.局部变量 进程, 进程信息, , "0".局部变量 计次, 整数型.局部变量 N, 整数型进程 = 取系统进程列表 ()计次 = 取数组成员数 (进程).计次循环首 (计次, N) .如果真 (到小写 (进程 [N].进程名称) = 到小写 (进程名)) 返回 (真) .如果真结束.计次循环尾 ()返回 (假)2.使用超级模块,命令为:进程是否存在("进程名-文本型")