如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public string ThreadTryRequest(string strUrl, string parm)
{
Thread thrOne = new Thread(thisThreadProc); //创建线程
ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值
parameterStrUrl = strUrlToString();
parameterparm = parmToString();
thrOneStart(parameter); //开启线程
return strState; //返回字符串
}
你想在这里就获取到值 那是获取不到的 return strState; 执行了
thisThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,
所以我说你的思路是错误的
你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~
以你的演示代码可以使用
GetExitCodeThread方法,仅限windows平台
不过这样有限制,只能是unsigned int类型,或者是能强制转换为此类型的类型
可以用其他方法来获取
如:
unsigned int threadres = 0;
unsigned int __stdcall Fun(void pPM); //线程函数
{
int _in = (int)pPM;
threadres = do_sth(_in);
return 0;
}
void main()
{
handle = (HANDLE)_beginthreadex(NULL, 0, Fun, &parm, 0, NULL);
WaitForSingleObject( handle, INFINITE);
unsigned int a = threadres;
}
但是要保证threadres的生命周期要大于线程的生命周期,不然就有问题
_endthreadex这作用是结束当前线程
unsigned int __stdcall Fun(void pPM); //线程函数
{
int _in = (int)pPM;
_endthreadex();//线程在这里结束,后边不会运行了
return do_sth(_in);
}
是有死循环, 估计你是把if写成while了吧? 条件判断符号== 写成=了。我给你改了一下,你看看是不是你要的。
#include "iostream"
using namespace std;
#include "cmath"
void main()
{
int i=0,j=0;
double thita[8]=,
x[8]=,
y[8]=,
a[8]=,
b[8]=,
S=04142,
A,B,E,
I[8][8],ln[8],aatan[8];
for(i=0;i<=7;i++)
{
for(j=0;j<=7;j++)
{
if(i==j)
I[i][j]=31416;
else
{
A=0-(x[i]-a[j])cos(thita[j])-(y[i]-b[j])sin(thita[j]);
B=(x[i]-a[j])(x[i]-a[j])+(y[i]-b[j])(y[i]-b[j]);
E=(x[i]-a[j])sin(thita[j])-(y[i]-b[j])cos(thita[j]);
ln[j]=log(1+(SS+2AS)/B);
aatan[j]=atan((S+A)/E)-atan(A/E);
I[i][j]=05sin(thita[i]-thita[j])ln[j]-cos(thita[i]-thita[j])aatan[j];
}
cout<<I[i][j]<<" ";
if(j == 7)
cout<<endl;
}
if(i == 7)
cout<<endl;
}
}
#include <Windowsh>
#include <iostream>
#include <stdioh>
using namespace std;
DWORD WINAPI ThreadPro(LPVOID lpParamter);
BOOL bRunning = TRUE;
int main()
{
HANDLE hThread = CreateThread(NULL,0,ThreadPro,0,0,NULL);
DWORD dwExitCode;
GetExitCodeThread(hThread,&dwExitCode);
printf("0x%08X\n",dwExitCode);
system("pause");
bRunning = FALSE;
system("pause");
GetExitCodeThread(hThread,&dwExitCode);
printf("0x%08X\n",dwExitCode);
system("pause");
CloseHandle(hThread);
return 0;
}
DWORD WINAPI ThreadPro(LPVOID lpParamter)
{
while(bRunning)
{
Sleep(1000);
}
return 4L;
}
这个代码给你参考,线程的创建和销毁过程还是很复杂的,想要深入一点了解的话,再问我吧!
如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗?
就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。
如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public
string
ThreadTryRequest(string
strUrl,
string
parm)
{
Thread
thrOne
=
new
Thread(thisThreadProc);
//创建线程
ThreadParameter
parameter
=
new
ThreadParameter();
//实例化ThreadParameter对象,并赋值
parameterStrUrl
=
strUrlToString();
parameterparm
=
parmToString();
thrOneStart(parameter);
//开启线程
return
strState;
//返回字符串
}
你想在这里就获取到值
那是获取不到的
return
strState;
执行了
thisThreadProc(parameter)
还没执行完了,这个时候strState
还没被赋值,
所以我说你的思路是错误的
你想当时就知道一个线程的执行结果,除非你等~~~
要不获取不到的~~~
以上就是关于C# 多线程获取返回值问题全部的内容,包括:C# 多线程获取返回值问题、C++ 线程 返回值、C++ 线程返回值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)