c++-Windows C++多线程程序如何调适?

问题描述

Windows C++多线程程序如何调适?

断点调适不适用了,应该怎么调适呢?我看有说log打印信息的,怎么实现呢?或者推荐一些文章吧。

解决方案

对,设置断点,你会容易阻塞当前线程,从而让多线程的一些交互不能跟运行时一样
log输出就是在各个线程中打印一些日志信息,然后分析log文件来观察线程的运行状态
可以参考log4cplus
c++开源日志库log4cplus

解决方案二:

1>e:vcfilevc_teachinglog4cplustestlog4cplustestmain.cpp(13) : error C2665: “log4cplus::Logger::getInstance”: 2 个重载中没有一个可以转换所有参数类型 1> d:program filesmicrosoft visual studio 9.0vcincludelog4cpluslogger.h(93): 可能是“log4cplus::Logger log4cplus::Logger::getInstance(const log4cplus::tstring &)” 1> 试图匹配参数列表“(const char [5])”时 1>e:vcfilevc_teachinglog4cplustestlog4cplustestmain.cpp(13) : error C2512: “log4cplus::Logger”: 没有合适的默认构造函数可用

解决方案三:

VS 输出日志 用DebugOutputStringA/DebugOutputStringW(Unicode).

可以先用wsprintfA/wsprintfW(Unicode)格式化日志,在调用DebugOutputStringA/DebugOutputStringW输出。

解决方案四:

这个是在http://bbs.csdn.net/topics/390341664这篇帖子里看到的,别人写的一个简单的LOG程序,我仔细研究了一下觉得也可以,但不太明白为什么作者说他自己的这个log尺有所短,寸有所长?各位专家觉得这样写log对原程序影响大吗?

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
char logstr[16000];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%dn",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}

解决方案五:

这种需要在全速运行下才能出现的BUG,一定要有日志才能定位。就算是自己定义一个log类也不是很困难吧,相信对于一个深入到多线程的人来说,弄个日志妥妥的。

在日志上标出时间和线程ID就可以了。

解决方案六:

FILE *p = fopen("log.txt", "a+");
if (NULL != p)
{
fprintf(p, "write something you want");
fclose(p);
}

解决方案七:

你可以使用VS的调试窗口输出来进行多线程调试:
outputdebugstring("")这个函数,你看看,会在调试时输出到vs的output窗口上
TRACE()这个是宏定义

解决方案八:

可以采用log的方式来调试,多线程注意是否需要同步的问题

时间: 2024-10-31 12:09:03

c++-Windows C++多线程程序如何调适?的相关文章

窗体之间的传值-C#windows窗体应用程序

问题描述 C#windows窗体应用程序 public partial class AddForm : Form { private int intTemp; private user use = new user(); public AddForm(int temp user u) { intTemp = temp; use= u; InitializeComponent(); } private RedoForm parentForm; public RedoForm pForm { get

利用C#线程窗口调试多线程程序

  从网上的资料判断,调试多线程程序似乎就一下3种方法. 1.在日志的某个地方写日志文件. 优点:不会干扰程序的执行,特别是对网络的多线程通信. 缺点:每次都需要打开日志文件以查看进程运行的信息. 2.利用断点进行调试. 优点:直观,可以直接看到运行过程的值 缺点:在多个线程设置断点,可能让程序跳来跳去,还需要额外地分出一部分精力用来理清程序的逻辑 3.利用弹出窗口来查看进程调试的信息. 优点;直观 缺点;在调试网路通信的时候,使得通信的过程产生延时,导致通信失败. 4.利用vs2010自带的线

初学Java写的第一个多线程程序

程序|初学|多线程 /** 文件名 : FirstTread.java 描述 :初学Java写的第一个多线程程序 作者: 慈勤强 cqq1978@yeah.net 参考:http://java.sun.com **/ import java.io.*;import java.net.*; public class FirstTread extends Thread{ public void run() { int i=0; try { String hostname = "www.flashem

创建一个Windows Service应用程序

window|程序|创建 创建一个Windows Service应用程序-------------------------------------------------------------------------------- 下载本文代码见资源 正是由于.NET Framework的出现,才使你能够构建出在系统重新启动时自动运行的.无人参与的(unattended)应用程序.by Stan Schultes技术工具箱:VB.NET, XML, ASPWindows service应用程序

Java多线程程序设计基础

在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行. 随着Internet的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时CPU资源被白白的闲置起来.如果在后台程序中能够同时处理多个任务,该多好啊!应Internet技术而生的Java语言解决了这个问题,多线程程序是Java语言的一个很重要的特点.在一个Jav

在Windows Phone 8与Windows 8应用程序之间共享代码

Visual Studio 2012 为构建 Windows 8 和 Windows Phone 8 应用程序提供了一套出色的工具.因此,可以进 行适当的探究,以了解可在应用程序的 Windows 应用商店版本与 Windows Phone 版本之间共享多少代 码. 您可以采用多种不同语言编写 Windows 应用商店应用程序:XAML 搭配 C#.Visual Basic .C++,甚至是 HTML5 搭配 JavaScript. 通常采用 XAML 搭配 C# 或 Visual Basic

Windows 8 metro程序分屏显示技巧

  Windows 8 metro程序分屏显示技巧 据悉,Win8新增的分屏显示功能,能让某个Metro应用固定在屏幕左/右侧,相当于同时显示两个全屏程序(包括桌面).那么win8的程序分屏显示功能作为一个新生的事物,很多用户都不熟悉,该如何运用呢? 微软展示了 Windows 8 之一是功能的管理单元.微软,只有高分辨率的 Pc 上提供此功能. Windows 8 metro 程序分屏显示技巧 与一些注册表修改,您可以强制启用快照不受支持的机器上. 在开始屏幕上键入 regedit 并查找以下

windows中将绿色程序添加到鼠标右键

windows中将绿色程序添加到鼠标右键 1.绿色软件是很多人的最爱,但是也有一些问题,需要我们来解决,那就是如何将常用的软件添加到鼠标右键,比如,notepad++绿色版的软件,我们想让她能够出现在鼠标右键中,这样当我们遇到一个文件想用notepad++打开时,只要用鼠标右键就可以直接打开了. 2.下面介绍如何把一个程序添加到鼠标右键.主要就是修改注册表来实现的. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*shell] [H

PowerShell将Windows store应用程序安装为开发者模式

原文: PowerShell将Windows store应用程序安装为开发者模式 在本地部署Windows 商店应用程序时,我们会遇到Add-AppDevPackage.ps1脚本,这个脚本和所在安装包都是visual studio 生成的.应用程序安装完毕后为:非开发者模式.我们可以用PowerShell简单验证下: PS C:\WINDOWS\system32> Get-AppxPackage -Name 88697998-99a4-4d0d-af2d-e3465acd3c20 Name :