我这个电脑配置为什么玩英雄联盟的电脑配置这么卡,fps只有十几十几

LoadRunner压测webservice线程异常退出
LoadRunner压测webservice接口,线程异常退出。 40并发controller与agent分开施压4核6G,2850 线程模式:运行几分钟后主线程退出 Abnormal termination, caused by mdrv process termination Action.c(6): Error: Web service call "submitNLSMSRequest_101" execution failedAction.c(6): Error: InvokeMethod failure: 外部组件发生异常。.Action.c(6): Error: ExtractResultArg failure: 外部组件发生异常。.Failed to Stop. Reason: TimeOutAction.c(6): Error: C interpreter run time error: Action.c (6):
Error -- memory violation : Exception ACCESS_VIOLATION received. 改用进程模式运行几分钟后报错:Runtime Error!Program:E:\LoadRunner\\mmdrv.exeR6025- pure virtual fuction call3333人阅读
搜索引擎的那些事(7)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 &联系信箱:feixiaoxing @】&& &&上面一篇博客当中,我们可以利用单一的线程完成网页的下载。今天,我们打算在此基础上完成多线程的访问和加载操作。使用多线程,倒不是因为这项技术有多牛,主要是因为我们想利用多线程的访问机制,充分利用线程的阻塞时间,这样可以在单位时间内完成更多的下载操作,这样至少可以帮助我们提高一部分效率。& & 要做到这一点的话,首先要对我们原来的代码进行少许的改造。怎么改造呢?首先就是我们需要把网页分成已访问和待访问两种。一方面,我们对网页进行下载,另一方面我们可以利用网页中链接信息下载新的网页。如果把整个网页看成是一个队列,那么就有一个front、一个end。每一个线程不断地从end中读取文件,获取到http地址之后插入到front之后,整个过程是一个while死循环过程。/* index to read html file */
static int get_read_index()
WaitForSingleObject(h_index, INFINITE);
if(end == front)
ReleaseSemaphore(h_index, 1, NULL);
return -1;
index = end ++;
ReleaseSemaphore(h_index, 1, NULL);
/* index to write html file */
static int get_write_index()
WaitForSingleObject(h_index, INFINITE);
index = front ++;
ReleaseSemaphore(h_index, 1, NULL);
& & 上面的过程就是记录索引的过程。当然,我们还需要进行另外一项改造工作,那就是把原来的函数工作模式修改成while(1)的线程工作模式。对于线程来说,就是不断地读取队列、不断地分析文件、不断地插入队列,就是这么简单。/* download page and its linked pages */
DWORD WINAPI download_page_entry(LPVOID param)
char name[64];
while( -1 == (index = get_read_index()))
Sleep(100);
memset(name, 0, 64);
sprintf(name, &E:/download/%d.html&, index);
if(OK == get_file_content(name, &buffer, &size))
get_http_and_download(buffer);
free(buffer);
& & 上面两段代码就是我们所做的基本修改动作。当然还有其他一些注意事项,比如说,注意第一个网页的下载过程、在生成可执行文件的时候一定要选用MultithreadDebugDll选项,编写代码的时候注意进行拷机测试。最后的话,就啥也不说了,贴上源码。当然,还是和原来一样,如果大家希望可以运行执行这段代码的话,一定要在E盘创建一个download目录,其他的就什么也不用管了。#include &stdio.h&
#include &windows.h&
#include &wininet.h&
#include &assert.h&
#ifdef ERROR
#undef ERROR
#define U8 unsigned char
#define U32 unsigned int
#define STATUS unsigned int
#define OK 0
#define ERROR (~0L)
#define MAX_BLOCK_SIZE 1024
#define MAX_DOMAIN_NAME_LENGTH 64
#define MAX_THREAD_NUMBER (8)
#pragma comment(lib, &wininet.lib&)
static STATUS download_web_page(const char* url, const char* path);
static int end = 0;
static int front = 1;
static HANDLE h_
/* index to read html file */
static int get_read_index()
WaitForSingleObject(h_index, INFINITE);
if(end == front)
ReleaseSemaphore(h_index, 1, NULL);
return -1;
index = end ++;
ReleaseSemaphore(h_index, 1, NULL);
/* index to write html file */
static int get_write_index()
WaitForSingleObject(h_index, INFINITE);
index = front ++;
ReleaseSemaphore(h_index, 1, NULL);
/* get length of html file */
static int get_file_size(const char* path)
int size = 0;
hFile = CreateFile(path, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
size = GetFileSize(hFile, NULL);
CloseHandle(hFile);
/* get all data from html file */
static STATUS get_file_content(const char* path, void** pp_buffer, int* size)
if(NULL == path)
return ERROR;
if(NULL == pp_buffer)
return ERROR;
if(NULL == size)
return ERROR;
length = get_file_size(path);
if(0 == length)
return ERROR;
buffer = (char*) malloc(length +1);
if(NULL == buffer)
return ERROR;
buffer[length] = '\0';
hFile = fopen(path, &r+b&);
if(NULL == hFile)
free(buffer);
return ERROR;
fread(buffer, 1, length, hFile);
fclose(hFile);
*pp_buffer =
return OK;
/* show all http name, sometimes just for debug use */
static void print_http_name(const char* buffer, int size)
while(size --)
printf(&%c&, *buffer ++);
printf(&\n&);
static void download_linked_page(const char* url, int size)
char name[64];
print_http_name(url, size);
data = (char*)malloc(size + 1);
if(NULL == data)
data[size] = '\0';
memmove(data, url, size);
memset(name, 0, 64);
sprintf(name, &E:/download/%d.html&, get_write_index());
download_web_page(data, name);
free data memroy, which contained http domain name */
free(data);
/* get http form html file, then download it by its name*/
static void get_http_and_download(const char* buffer)
const char*
const char*
if(NULL == buffer)
next = strstr(next, &http://&);
if(NULL == next)
count = MAX_DOMAIN_NAME_LENGTH;
next += strlen(&http://&);
if(!count)
letter = *
if('&' == letter || '\'' == letter || ')' ==
letter || '&' == letter)
download_linked_page(prev, next - prev);
/* implement page download */
static STATUS download_web_page(const char* url, const char* path)
U8 buffer[MAX_BLOCK_SIZE];
HINTERNET hS
HINTERNET hU
hSession = InternetOpen(&RookIE/1.0&, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(NULL == hSession)
return ERROR;
hUrl = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if(NULL == hUrl)
result = ERROR;
goto error1;
hFile = fopen(path, &wb&);
if(NULL == hFile)
result = ERROR;
goto error2;
iNumber = 1;
while(iNumber & 0)
InternetReadFile(hUrl, buffer, MAX_BLOCK_SIZE -1, &iNumber);
fwrite(buffer, sizeof(char), iNumber, hFile);
fclose(hFile);
result = OK;
InternetCloseHandle(hUrl);
InternetCloseHandle(hSession);
/* download page and its linked pages */
DWORD WINAPI download_page_entry(LPVOID param)
char name[64];
while( -1 == (index = get_read_index()))
Sleep(100);
memset(name, 0, 64);
sprintf(name, &E:/download/%d.html&, index);
if(OK == get_file_content(name, &buffer, &size))
get_http_and_download(buffer);
free(buffer);
/* entry of programme */
int main(int argc, char* argv[])
HANDLE h_download[MAX_THREAD_NUMBER];
h_index = CreateSemaphore(NULL, 1, 1, NULL);
if(NULL == h_index)
assert(0);
/* 0.html is just the start page */
download_web_page(&&, &E:/download/0.html&);
for(index = 0; index & MAX_THREAD_NUMBER; index ++)
h_download[index] = CreateThread(NULL, 0, download_page_entry, 0, 0, NULL);
if(NULL == h_download[index])
assert(0);
WaitForMultipleObjects(MAX_THREAD_NUMBER, h_download, TRUE, INFINITE);
CloseHandle(h_index);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3357650次
积分:34383
积分:34383
排名:第105名
原创:349篇
评论:2468条
(6)(2)(4)(1)(1)(1)(1)(1)(1)(3)(1)(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(3)(1)(1)(4)(4)(1)(7)(4)(16)(2)(1)(2)(3)(1)(1)(1)(2)(1)(3)(4)(5)(4)(3)(4)(4)(4)(7)(8)(9)(5)(6)(9)(8)(7)(7)(11)(19)(27)(30)(43)(30)(2)(1)(1)(1)(1)当前位置: →
→ 多线程如何用在什么情况下用
多线程如何用在什么情况下用
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: 多线程怎么用?在什么情况下用?rt,java里面的线程类是Thread,构造线程对象一般有几种用法:1,继承java.lang.Thread(不推荐).2,...
"多线程如何用在什么情况下用"::
多线程怎么用?在什么情况下用?rt------解决方案--------------------java里面的线程类是thread,构造线程对象一般有几种用法:1,继承java.lang.thread(不推荐).2,实现java.lang.runnable接口,再new一个tread,把你的runnable的实现类当作参数传给tread的构造函数.3,可以把thread作为一成员变量,自己实现java.lang.runnable接口,把this传给thread的构造函数(同2).
只要调用线程对象的start()方法线程就跑起来了.
1.一般线程在你有定时任务时常用,像jdk的timer,开源的quartz等.
2.你对某项任务的并发性要求较高时常用,(此时也许甚至会使用线程池).
3.需要长期轮询某个对象,等待某种资源,又希望主程序继续的情况等等
------解决方案--------------------比如説遊戲,就經常用到多綫程!
樓主可以到網上去搜一下這方面的例子啊!
------解决方案--------------------在java语言产生前,传统的的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。 随着的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时cpu资源被白白的闲置起来此文来自: 马开东博客
转载请注明出处 网址:
。如果在后台程序中能够同时处理多个任务,该多好啊!应技术而生的java语言解决了这个问题,多线程程序是java语言的一个很重要的特点。在一个java程序中,我们可以同时并行运行多个相对独立的线程,例如,我们如果创建一个线程来进行数据输入输出,而创建另一个线程在后台进行其它的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然在运行。多线程大大提高了程序执行效率和处理能力。
  线程的创建
  我们知道java是的程序语言,用java进行就是设计和使用类,java为我们提供了线程类thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是thread类或其子类的实例对象。下面是一个创建启动一个线程的语句:
  thread thread1=new thread(); file://声明一个对象实例,即创建一个线程;
  thread1.run(); file://用thread类中的run()方法启动线程;
  从这个例子,我们可以通过thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而thread类中的run()方法没有任何操作语句,所以这个线程此文来自: 马开东博客
转载请注明出处 网址:
没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。java中通常有两种方式定义run()方法:
  通过定义一个thread类的子类,在该子类中重写run()方法。thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。
  通过runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。在此,我们定义一个实现runnable() 接口的类,在该类中定义自己的run()方法,然后以该类的实例对象为参数调用thread类的构造方法来创建一个线程。
  线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。
  下面一个例子实践了如何通过上述两种方法创建线程并启动它们:
  // 通过thread类的子类创建的线程;
   class thread1 extends thread
    { file://自定义线程的run()方法;
     public void run()
      {
       system.out.println( &thread1 is running… &);
      }
     }
   file://通过runnable接口创建的另外一个线程;
  class thread2 implements runnable
   { file://自定义线程的run()方法;
    public void run()
     system.out.println( &thread2 is running… &);
   file://程序的主类 '
   class multi_thread file://声明主类;
     plubic static void mail(string args[]) file://声明主方法;
      {
       thread1 threadone=new thread1(); file://用thread类的子类创建线程;
       thread threadtwo=new thread(new thread2()); file://用runnable接口类的对象创建线程;
       threadone.start(); threadtwo.start(); file://strat()方法启动线程;
      }
     }
  运行该程序就可以看出,线程threadone和threadtwo交替占用cpu,处于并行运行状态。可以看出,启动线程的run()方法是通过调用线程的start()方法来实现的(见上例中主类),调用start()方法启动线程的run()方法不同于一般的调用方法,调用一般方法时,必须等到一般方法执行完毕才能够返回start()方法,而启动线程的run()方法后,start()告诉系统该线程准备就绪可以启动run()方法后,就返回start()方法执行调用start()方法语句下面的语句,这时run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。
  线程的优先级
  对于多线程程序,每个线程的重要程度是不尽相同,如多个线程在等待获得cpu搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
多线程如何用在什么情况下用_JavaWeb相关文章
JavaWeb_总排行榜
JavaWeb_最新
JavaWeb_月排行榜
JavaWeb_周排行榜
JavaWeb_日排行榜
马开东博客专栏
企业软件/开发
硬件/嵌入开发
马开东博客专栏
应用服务器
软件工程/管理/测试
马开东博客专栏
Linux/Unix
马开东博客专栏
开发语言/框架
专题开发/技术/项目
马开东博客专栏
高性能开发
马开东博客专栏Javascript多线程引擎(九)
圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep 算法 最后进化到 分代回收, 可以发现程序员越来越懒了^_^.
    从繁琐的内存管理解放出来 对业务逻辑开发为主的程序员来说是非常有必要的事情, &So
等高级语言变成了现今的主流语言(当然也和它的跨平台和异常强大的类库相关).
& & & & 作为Javascript引擎, 当然也不能少了垃圾回收的功能, &Google V8 , TraceMonkey 等都带有一个非常牛掰的垃圾回收机制外加JIT功能, 使得它们摇身一边就成了服务器引擎.
   而这个项目的垃圾回收在前期决定不添加该功能, 到后期发现少了垃圾回收对内存的消耗太过于厉害(原先估算1MB的内存能干很久了, 结果发现短短几分钟就被吃掉了), 所以在写前一篇文章的时候, 进入了深入的思考, 如何把垃圾回收添加到该引擎上.
   &开发过程中遇到的问题有很多(主要的问题是关系图完整性的确定):
     1. 如何最小化的侵入原有代码中(使用mark-sweep)
     2. 如何同步 EVAl线程和 Async线程(EVAL 线程为运行Js代码的线程, Async线程相当于AJAX的线程, 这个线程的内存控制不受VM管理, 在结束Async线程的时候需要把必要的数据同步到VM 的GC管理器中),
     &3. 如何选择一个时机来进行垃圾回收, 对于多线程同时进行申请内存如何进行快速的分配而不因为加锁而导致效率下降(记录新的内存申请需要把该内存申请记录到GC中) & & & &
     &4. 如何快速的插入新申请内存的记录到GC管理中(以内存地址为hashcode插入到Hashtable中实现了O(1)的时间),....
  为了解决这些问题, 翻阅了lua代码,jamvm(Java 的解释器版本不带有JIT等该机特性). 归纳了如下的解决方案:
& & & & & & &  1. &每条线程都附带一个HashTable进行管理该线程进行GC Malloc的内存记录, 在线程结束的时候, 把TLS中关于GC的内存记录 Commit 到主存
       &2. 垃圾回收的地点发生在主存, 对于TLS中的申请记录即使没有被Mark到也不进行回收(这是为了线程运行中的那些临时数据), 这也保证了Async线程Malloc的内存不会被回收.&
      3. 只有当VM所有Engine都处于IDLE状态的时候才进行垃圾回收, 这保证了EVAL中的临时数据不会被破坏.
      4. 为了保证关系图的完整性 , 如一次链表的插入, &A-&B 的关系中, 需要变成 A-&C-&B的关系, 期间有可能临时变化为 &A C-&B 这种引用关系, 而如果期间再发生GC的话, 就发生灾难性后果, B以及链接在B的子对象被回收, 所以选择了在线程结束(这个时候不可能有不完整的关系图 )或者一次手动Commit()内存到主存的API给程序员控制(调用该API需要确保关系图的完整性).
& & & & 如下是GC的测试结果:
      
    每次运行fun函数, 会申请
= 10W 个对象
    然后由调用setTimeout() 等待10s的时间, 来使得Engine都处于IDLE状态, GC线程进行工作.
& & & & &&
   (以上单位是字节)
    运行完毕后, 10w个对象相当于使用了 17MB的内存, GC 过后, &只有11KB的内存被占用这, 这部分内存其中有10KB左右被预置对象[Global, Thread, Object, Function ... ]和VM必要数据占用, 而剩余的1KB则是运行文件后, 产生fun函数对象记录到Global中就不会被释放掉了。
   所以垃圾回收模块可以算是完成了, 性能也不错, 开启 到申请10w个对象,完成17MB内存的回收只用了 5秒左右, GC的时间差不多为0.5s 左右, & 不过这个性能和JVM相比还是不好的, &JVM可以在Engine不打断执行的情况下完成垃圾回收, 具体的做法就是把完整性确定的时间进行细分, 使得可以在运行Java代码的时候回收内存.
   & &现在这个项目可以算是比较完整了^_^ , 就是缺少了一些应用比如说 web服务等, 这些等下一个版本再做。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'LoadRunner压测webservice接口线程异常退出
时间: 02:34:02
LoadRunner压测webservice接口,线程异常退出。
controller与agent分开
施压服务器4核6G,2850
线程模式:
运行几分钟后主线程退出
Abnormal termination, caused by mdrv process termination
Action.c(6): Error: Web service call "submitNLSMSRequest_101" execution failed
Action.c(6): Error: InvokeMethod failure: 外部组件发生异常。.
Action.c(6): Error: ExtractResultArg failure: 外部组件发生异常。.
Failed to Stop. Reason: TimeOut
Action.c(6): Error: C interpreter run time error: Action.c (6):
Error -- memory violation : Exception ACCESS_VIOLATION received.
改用进程模式
运行几分钟后报错:Runtime Error!
Program:E:\LoadRunner\bin\mmdrv.exe
- pure virtual fuction call
$T.total > 0 && $T.page <= $T.pageNum}
{#foreach $T.data as r}
{$T.r.formt_tm}{#if $T.r.nickname}{#else}匿名{#/if}
{$T.r.content}
{#if $T.page > 1 && $T.pageNum > 1)
$T.s_num > 2}
{#for index = $T.s_num to $T.e_num}
$T.pageNum > $T.pageNavSize+ 2 && $T.s_num != $T.pageNum - $T.pageNavSize}
{#if $T.pageNum > 1}
{#if $T.pageNum != $T.page && $T.pageNum > 1}
<a href="javascript:void(0);" page="{$T.page 下一页
您的回应...
也许你感兴趣
(C)2012 本站提供的内容来源于广大网络用户,我们不保证内容的正确性。如果转载了您的内容,希望删除的请联系我们!}

我要回帖

更多关于 玩英雄联盟电脑配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信