小编Dre*_*pin的帖子

睡眠()是一个糟糕的设计,但似乎是我唯一的选择

我正在编写一个IO类,通过RS-232串口上传/下载文件到控制器.不幸的是,我无法一次发送整个文件,我必须将其分解为数据包并一次发送一点.这是基本方法......

ifstream file ("path/to/file.ext", ios::in | ios::binary);

while( !file.eof() )
{
    //... zero buffer, and add packet header (8 bytes)
    size_t nResult = file.read( &buffer[8], 129 );
    Serial.Write( buffer, nResult+8 );
    //... see if controller wrote anything to the serial port and process it's command
    Sleep( 600 );
}
Run Code Online (Sandbox Code Playgroud)

我知道使用Sleep()不是一个好的设计实践,但如果我删除Sleep()语句甚至缩短循环休眠的时间,那么控制器会抛出有关它的缓冲区已满的错误,并且传输失败.有一个更好的方法吗?

在您说出之前,我不能向控制器发送消息以确定它是否已准备好接收下一个数据包.它没有这个功能.

编辑: 我忘了提到我不得不睡觉的时间间隔有些"失明".制造商提供的协议规范没有详细说明数据包之间所需的任何时间长度.所以我必须通过反复试验来确定这个价值.我担心它可能无法在每台PC上运行,因此它可能无法在每个控制器上运行.

这项开发正在针对Windows XP/Vista/7进行.

编辑#2: 此外,每个数据包的数据量实际上也是一个试错误猜测.协议规范允许65,535字节的数据包(包括标头).但是如果你一次发送超过129个字节,你就会开始看到有时它可以工作的问题,有时则不会.您必须睡眠的时间与您可以发送的字节数之间似乎存在关系.如果我将数据包大小减少到每个数据包20个字节,我可以将睡眠时间减少到400毫秒.我相信这些问题的原因源于控制器将数据从缓冲区移动到文件所花费的时间.

c++ windows sleep serial-port

7
推荐指数
1
解决办法
1432
查看次数

VB6 Timer(),Space()Form_Initialize()导致立即崩溃

创建一个新的VB6项目.将以下代码粘贴为项目代码.命中运行.看它是否崩溃...在此代码中删除或简化您喜欢的任何内容,然后它将正常工作.任何人都可以详细说明为什么会崩溃?

到目前为止,这已经在8台PC上进行了测试,所有这些都运行Windows XP,Windows Vista,Windows 7,Office 2010和Office 2007的各种组合.在Visual Basic IDE中测试它的是安装了Visual Basic 6 SP 6.

Private Sub Sleep(ByVal nSeconds As Long)
    Dim nStart As Long: nStart = Timer
    Do
        DoEvents
    Loop Until (Timer - nStart) >= nSeconds
End Sub

Private Sub Crash()
    Dim sTempPath As String: sTempPath = Space(255)
End Sub

Private Sub Form_Initialize()
    Sleep 1
    Crash
End Sub
Run Code Online (Sandbox Code Playgroud)


附录#1:

我把它作为Excel中的一个宏,取而代之Form_Initialize()Workbook_Open(),当然,当你打开文档时.它崩溃了!

附录#2:

我在点击"运行"之前向每一行添加了断点,并在它到达第一个断点之前崩溃了.但同样,如果我简化或删除任何内容,它工作正常,不会崩溃.

附录#3:

试过MicSim关于取出结肠的建议,并没有崩溃.添加它,再次运行它并没有崩溃.关闭Visual Basic,并输入原始代码并将其崩溃.

附录#4:

Visual Basic 6 IDE中的问题详细信息:

问题签名:
问题事件名称:APPCRASH …

vb6 windows-xp 32-bit windows-7

6
推荐指数
1
解决办法
2888
查看次数

如果其他构造函数创建了通过构造函数传递的对象,我是否应该处理该对象?

鉴于以下代码,我是否应该仅在类foo内创建它时才进行处置Barfoo或者即使它被传递给构造函数,我也应该始终进行处理吗?我想我可能应该添加另一个私有变量来跟踪是否Bar创建foo或是否传递给构造函数,并且仅在构造函数创建它时Bar( Foo foo )进行处理。foopublic Bar( string name )

public class Bar: IDisposable
{
    private Foo foo = null;

    public Bar( string name )
    {
        this.foo = new Foo(name);
    }
    public Bar( Foo foo )
    {
        this.foo = foo;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose( bool disposing )
    {
        if( disposed )
            return;
        if( disposing )
            foo.Dispose();
        this.disposed = true;
    } …
Run Code Online (Sandbox Code Playgroud)

c# constructor dispose class

6
推荐指数
1
解决办法
1313
查看次数

VBA中的格式(SomeDate,"MM/dd")="12-15"

我正在Excel中编写一个VBA宏来分析电子表格中的数据并发送电子邮件.在这个宏中,我必须附加格式为"MM/dd"的日期,但输出的格式为"MM-dd".所以问题是,为什么我的斜线被短划线取代?

为简单起见,我已将代码缩减到此示例,并验证此示例存在的问题...

Private Sub Test()
    Dim Yesterday As Date: Yesterday = DateAdd("d", -1, Now)
    MsgBox Format(Yesterday, "MM/dd")
End Sub
Run Code Online (Sandbox Code Playgroud)

运行时,消息框按预期显示"12-15"而不是"12/15".

excel vba date

5
推荐指数
1
解决办法
6859
查看次数

命名管道CreateFile()返回INVALID_HANDLE_VALUE,GetLastError()返回ERROR_PIPE_BUSY

我编写了一个类来处理命名管道连接,如果我创建一个实例,关闭它,然后尝试创建另一个实例调用CreateFile()return INVALID_HANDLE_VALUE,并GetLastError()返回ERROR_PIPE_BUSY.这里发生了什么?我该怎么做才能确保电话Connect()成功?

PipeAsync A, B;

A.Connect("\\\\.\\pipe\\test",5000);
A.Close();

cout << GetLastError(); // some random value
B.Connect("\\\\.\\pipe\\test",5000);
cout << GetLastError(); // 231 (ERROR_PIPE_BUSY)
B.Close(); 
Run Code Online (Sandbox Code Playgroud)

这是我Connect()和的实现Close()

BOOL PipeAsync::Connect(LPCSTR pszPipeName, DWORD dwTimeout)
{
    this->pszPipeName = pszPipeName;
    this->fExisting = TRUE;
    DWORD dwMode = this->fMessageMode ? PIPE_READMODE_MESSAGE : PIPE_READMODE_BYTE;

    hPipe = CreateFile(
        this->pszPipeName,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL);

    if( INVALID_HANDLE_VALUE == hPipe )
        return FALSE; /* set break point here ; …
Run Code Online (Sandbox Code Playgroud)

c++ winapi named-pipes

5
推荐指数
1
解决办法
1万
查看次数

WinMain vs. main (C++)

I'm fairly new to C++, but have done some .NET programming before.

What is the difference between main(...) and WinMain(...), I wrote a program earlier with main(...) and was able to call Win32 functions just fine like I am with WinMain(...), so this leads me to ask "where would it be best to use one over the other, or does it even make a difference?"

c++ winapi

5
推荐指数
1
解决办法
1万
查看次数

dotnet.exe 将无法运行,因为缺少 api-ms-win-crt-runtime-l1-1-0.dll

我需要在Windows Server 2008 R2 SP 1 上的 IIS 中托管ASP.NET Core 2.0应用程序。我正在遵循有关如何使用 IIS 在 Windows 上托管 ASP.NET Core 的文档指南。

安装后还是无法运行dotnet.exe。它调用一个名为 的 DLL api-ms-win-crt-runtime-l1-1-0.dll

该程序无法启动,因为您的计算机缺少 api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序来解决此问题。

但是,计算机上有很多该文件的实例,位于以下文件夹中:

  • C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.3
  • C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\2.0.3
  • C:\Windows\winsxs\amd64_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.18972_none_a9a51144251fb166
  • C:\Windows\winsxs\amd64_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.23175_none_aa31870f3e3ad077
  • C:\Windows\winsxs\amd64_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.23656_none_aa4830af3e29a3af
  • C:\Windows\winsxs\x86_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.18972_none_4d8675c06cc24030
  • C:\Windows\winsxs\x86_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.23175_none_4e12eb8b85dd5f41
  • C:\Windows\winsxs\x86_microsoft-windows-u..rsalcrt-apifwd-win7_31bf3856ad364e35_6.1.7601.23656_none_4e29952b85cc3279

指令说:

在托管系统上安装.NET Core Windows Server 托管捆绑包。[...] 如果系统没有 Internet 连接,请在安装 .NET Core Windows Server 托管捆绑包之前获取并安装Microsoft Visual C++ 2015 Redistributable 。

我已多次安装/修复这两个软件包,但出现相同的错误。

windows windows-server-2008-r2 asp.net-core

5
推荐指数
1
解决办法
9232
查看次数

如何将初始化列表作为函数参数传递?

基本上,我希望做这样的事情:

HANDLE hThread1 = CreateThread(...);
HANDLE hThread2 = CreateThread(...);
HANDLE hThread3 = CreateThread(...);

...

WaitForMultipleObjects( 3, {hThread1,hThread2,hThread3}, FALSE, INFINITE );
Run Code Online (Sandbox Code Playgroud)

而不是这个:

HANDLE hThread[3];
hThread[0] = CreateThread(...);
hThread[1] = CreateThread(...);
hThread[2] = CreateThread(...);

...

WaitForMultipleObjects( 3, hThread, FALSE, INFINITE );
Run Code Online (Sandbox Code Playgroud)

我发现的唯一解决方案是使用std::initializer_list,但显然WaitForMultipleObjects()并不接受std::initializer_list

c++

4
推荐指数
1
解决办法
5193
查看次数

通知图标接收到 WM_LBUTTONDBLCLK 但未接收到 WM_CONTEXTMENU

我向基于对话框的应用程序添加了一个通知图标,当双击该图标时,它收到了 WM_LBUTTONDBLCLK,但当右键单击该图标或用键盘突出显示该图标并且上下文菜单键为按下。我根据 Windows 7.1 SDK 示例中的示例使用通知图标。所以,我不知道我哪里出了问题,也不知道为什么这不起作用。

注意:如果我将 WM_CONTEXTMENU 更改为 WM_RBUTTONUP,它会收到事件,但光标坐标错误。

/******************************************************************************/
/* Menu Resource                                                              */
/******************************************************************************/
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDR_TRAYMENU MENU
{
    POPUP ""
    {
        MENUITEM "&Show Status Window", IDM__SHOW_STATUS_WINDOW
        MENUITEM "&About", IDM__ABOUT
        MENUITEM SEPARATOR
        MENUITEM "&Exit", IDM__EXIT
    }
}

/******************************************************************************/
/* WinMain()                                                                  */
/******************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{

    // ... code unrelated to icon

    // Enable Visual Styles
    InitCommonControls();

    // create the main dialog
    if( NULL == (hWnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAINDLG),NULL,(DLGPROC)WndProc)) )
    {
        MessageBox( …
Run Code Online (Sandbox Code Playgroud)

c++ winapi visual-c++-2010

4
推荐指数
1
解决办法
3812
查看次数

覆盖父类的私人成员

鉴于以下课程:

class foo
{
private:
    int c;

public:
    foo( int a = 42 ) { c = a; }
    ~foo();
};

class bar: public foo
{
public:
    bar();
    ~bar();
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能让Ç用不同的号码?我可以这样做吗?

bar::bar() 
{
    c = 12;
}
Run Code Online (Sandbox Code Playgroud)

我在尝试编译时遇到此错误:

test.cpp:在构造函数中‘bar::bar()’:
test.cpp:8:7:error:‘int foo::c’是私有的

c++

3
推荐指数
1
解决办法
944
查看次数