c语言输入超时时给出提示

c语言输入超时时给出提示,第1张

5 秒内 没碰键盘 则退出。

未考虑 输入 结束时间的判断。

#include <stdio.h>

#include <conio.h>

#include <time.h>

int main(){

clock_t t0,dt

int flag

int x

t0=clock()

flag = 1

printf("please input x:\n")

while( !_kbhit() ) {

dt = clock() - t0

if (dt >= 5 * CLOCKS_PER_SEC) {flag =0 printf("5 seconds -- time is over !\n")return 0}

}

scanf("%d",&x)printf("x=%d\n",x)

return 0

}

MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:

MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.

也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。

而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。

使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:

请点击输入图片描述

其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取 *** 作被系统中断打断时才会重试,但是这个重试并没有次数限制。

从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。

同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:

请点击输入图片描述

这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时net->retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。

由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。

(楼上两位说的很对,我给你粘一篇文章吧 初学者 看看有好处。

需要的话 你可以留下邮箱 我这有一些初学者的文档可以发给你很不错,希望继续努力。面试,到时候一切都是是浮云。。。哈哈)

基本流程

万事开头难,任何一种新技术对于初学者来说最重要的还是“入门”,掌握其要点。让我们来看看ADO数据库开发的基本流程吧!

(1)初始化COM库,引入ADO库定义文件

(2)用Connection对象连接数据库

(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。

(4)使用完毕后关闭连接释放对象。

准备工作:

为了大家都能测试本文提供的例子,我们采用Access数据库,您也可以直接在我们提供的示例代码中找到这个test.mdb。

下面我们将详细介绍上述步骤并给出相关代码。

【1】COM库的初始化

我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:

BOOL CADOTest1App::InitInstance()

{

AfxOleInit()

......

【2】用#import指令引入ADO类型库

我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在FileView中的Header Files里找到)

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。

几点说明:

(1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改

(2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。

msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned

【3】创建Connection对象并连接数据库

首先我们需要添加一个指向Connection对象的指针:

_ConnectionPtr m_pConnection

下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉。

BOOL CADOTest1Dlg::OnInitDialog()

{

CDialog::OnInitDialog()

HRESULT hr

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection")///创建Connection对象

if(SUCCEEDED(hr))

{

hr = m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0Data Source=test.mdb","","",adModeUnknown)///连接数据库

///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51

}

}

catch(_com_error e)///捕捉异常

{

CString errormessage

errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage())

AfxMessageBox(errormessage)///显示错误信息

}

在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型

HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )

ConnectionString为连接字串,UserID是用户名, Password是登陆密码,Options是连接选项,用于指定Connection对象对数据的更新许可权,

Options可以是如下几个常量:

adModeUnknown:缺省。当前的许可权未设置

adModeRead:只读

adModeWrite:只写

adModeReadWrite:可以读写

adModeShareDenyRead:阻止其它Connection对象以读权限打开连接

adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接

adModeShareExclusive:阻止其它Connection对象以读写权限打开连接

adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

我们给出一些常用的连接方式供大家参考:

(1)通过JET数据库引擎对ACCESS2000数据库的连接

m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0Data Source=C:\\test.mdb","","",adModeUnknown)

(2)通过DSN数据源对任何支持ODBC的数据库进行连接:

m_pConnection- >Open("Data Source=adotestUID=saPWD=","","",adModeUnknown)

(3)不通过DSN对SQL SERVER数据库进行连接:

m_pConnection- >Open("driver={SQL Server}Server=127.0.0.1DATABASE=vckbaseUID=saPWD=139","","",adModeUnknown)

其中Server是SQL服务器的名称,DATABASE是库的名称

Connection对象除Open方法外还有许多方法,我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State

ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:

m_pConnection- >ConnectionTimeout = 5///设置超时时间为5秒

m_pConnection- >Open("Data Source=adotest","","",adModeUnknown)

State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:

if(m_pConnection- >State)

m_pConnection- >Close()///如果已经打开了连接则关闭它

------------------------------------------------------------------------------------

呵呵,是啊,我以前不做VC的,所以这次老板有个项目要做,没办法啊!!以后多请教啊!!

------------------------------------------------------------------------------------

你现在不少基础的不会,上来就连接数据库有点难

------------------------------------------------------------------------------------

要是你用vc6,就右健点击要添加变量的控件,选择classwizard,选择member variables选项卡,它会自动指到你想要添加变量的控件,你直接点选择add variable,起个名字就可以了

------------------------------------------------------------------------------------

我关键是不知道怎么给控件添加与之相对应的变量!!请明示啊!!

------------------------------------------------------------------------------------

CBaseEditBox是什么东西?你不要这样定义。应该先把控件放在对话框窗体上,再给这个控件添加与之相对应的变量,这样,VC就自动把控件和变量联系起来了

------------------------------------------------------------------------------------

刚弄,不怎么会,请明示!!!

我想把从数据库中读出来的记录放在一个文本框中!

然后在界面上放置了一个edit box

我在类C***Dlg中添加了变量

public:

CBaseEditBox m_list

接下来我在一个按钮的onOK事件里连接数据库并想把得到的记录放到m_list里

// 读入库中各字段并加入列表框中

while(!m_pRecordset- >adoEOF)

{

var = m_pRecordset- >GetCollect("UserName")

if(var.vt != VT_NULL)

strName = (LPCSTR)_bstr_t(var)

var = m_pRecordset- >GetCollect("Password")

if(var.vt != VT_NULL)

strAge = (LPCSTR)_bstr_t(var)

m_list.AddString( strName + " -- >"+strAge )

m_pRecordset- >MoveNext()

}

// 默认列表指向第一项,同时移动记录指针并显示

m_list.SetCurSel(0)

然后一大堆错误:

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2146: syntax error : missing "" before identifier "m_list "

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "CBaseEditBox " : missing storage-class or type specifiers

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "m_list " : missing storage-class or type specifiers

TestADODlg.cpp

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2146: syntax error : missing "" before identifier "m_list "

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "CBaseEditBox " : missing storage-class or type specifiers

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "m_list " : missing storage-class or type specifiers

D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(195) : error C2065: "m_list " : undeclared identifier

D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(195) : error C2228: left of ".AddString " must have class/struct/union type

D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(201) : error C2228: left of ".SetCurSel " must have class/struct/union type

Generating Code...

Error executing cl.exe.

请问什么原因那?

------------------------------------------------------------------------------------

http://www.vckbase.com/document/viewdoc/?id=496

把文章中连接Access的语句换成:

连接SQL数据库:

m_pConnection- >Open("Provider=SQLOLEDB.1Server=192.168.1.6DATABASE=mysqlUID=saPWD=","","",adModeUnknown)

其中Server是SQL服务器的名称,DATABASE是库的名称


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6893357.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-29
下一篇2023-03-29

发表评论

登录后才能评论

评论列表(0条)

    保存