我爱builder

C++Builder 程序员博客

本人程序基本结构是这样:
主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
现在问题是:
当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问有什么好的方法能避免这种状况的发生吗?
我在Sqlite中使用了互斥量进行加锁和解锁;小弟分数不多,在这里全给了,忘朋友们帮帮忙,谢谢!Sqlite多线程操作不太可靠.且效率低下,以前测试过,它只适合单机单线程的简单应用
如果你真的是用于应用而非个人测试.建议使用Embedded Firebird,它与BCB配合开发桌面应用,方便又可靠且效率是我在桌面数据库测试中最高的.木用过Sqlite
不知道Sqlite自身有没有事物、锁的概念
不过对于数据库如MSSQL、Oracle等,最好调用数据库本身的事物和锁 
Sqlite 的句柄不可以跨线程传递.
你要线程就要自己封装.

而且 这个数据库 在批量数据操作时候使用不使用事务效率相差很大Embedded Firebird 支持SQL吗?

<
有人封装过<使用> 
[打开-<使用>- 关闭]
也就是同一时刻只有一个Sqlite实例被打开. 那么正常打开退出,操作等没有异常呀什么发生,就不会在同一目录下产生一个临时文件或者rollback文件,这个时候也就不提示你锁定了.

Sqlite 自己带的事务琐 貌似不好用, 我在一个循环里面不挺的尝试上百次以后居然就进去了.
这个时候我另外一个事务 我还没有放开呢. 晕呀.

<
<
哈哈,支持SQL-99标准 就不错了. 下次我也找个项目运用一下.
而且是脱胎于Borland公司,没有理由不支持.问这个的原因 是有个叫 Berkeley DB 的东东是API接口调用的。 不支持SQL.
它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
很容易被锁定的。问一下楼主,问题解决了吗?

我也遇到类似问题,经常数据库会卡住很长时间,大于5分钟。关注一下,准备用这个东东呢.问题解决了,是资源释放的时候,没有释放干净。
sqlite3_finalize(sql_stmt);加入这条语句后就好了给分了,参与的都有分啊,大家平分一下这个问题我也碰到过,当时很郁闷啊,试了好多方法没有答案。
无奈换了个驱动包,问题解决,jdbcSqlite-v056.jar 好像是2.5*M的。
希望对楼主有用。

  • Filed under: C++ Builder
  • 我以下代码自定义数据集,然后添加数据,但发现在 DataSource6->DataSet->Open();
    这行开始出错,请问怎么解决?

      TDataSet *ADataSet=new TClientDataSet(this);
      TClientDataSet *TempTable=NULL;
      TDataSet *dsResult=NULL;
      TFieldDefs *AFieldDefs;

      ADataSet->FieldDefs->Add("Name",ftString,30,false);
      ADataSet->FieldDefs->Add("Value", ftInteger,0,false);

      AFieldDefs=ADataSet->FieldDefs;

      TempTable=new TClientDataSet(Application);
      TempTable->FieldDefs->Assign(AFieldDefs);
      TempTable->CreateDataSet();
      dsResult=(TDataSet *)TempTable;

      TempTable->Append();
      TempTable->FieldByName("Name")->AsString="Huang";
      TempTable->FieldByName("Value")->AsString="123";

      DataSource6->DataSet->Open();
      delete ADataSet;这不是建立临时表那个吗?

    你的DataSource6什么时候绑定数据集了,我怎么没看到?用代码怎么设置绑定以及添加数据,麻烦给个简单的例子吧

    我想问一下,创建字段的时候,例如以下这句,最后面那2个参数 0,false 分别是代表什么意思,另外这个具体的说明我应该查阅什么帮助文件?

    ADataSet->FieldDefs->Add("lackKuCun",ftFloat,0,false);

  • Filed under: C++ Builder
  • 本人程序基本结构是这样:
    主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
    现在问题是:
    当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问有什么好的方法能避免这种状况的发生吗?
    我在Sqlite中使用了互斥量进行加锁和解锁;小弟分数不多,在这里全给了,忘朋友们帮帮忙,谢谢!Sqlite多线程操作不太可靠.且效率低下,以前测试过,它只适合单机单线程的简单应用
    如果你真的是用于应用而非个人测试.建议使用Embedded Firebird,它与BCB配合开发桌面应用,方便又可靠且效率是我在桌面数据库测试中最高的.木用过Sqlite
    不知道Sqlite自身有没有事物、锁的概念
    不过对于数据库如MSSQL、Oracle等,最好调用数据库本身的事物和锁 
    Sqlite 的句柄不可以跨线程传递.
    你要线程就要自己封装.

    而且 这个数据库 在批量数据操作时候使用不使用事务效率相差很大Embedded Firebird 支持SQL吗?

    <
    有人封装过<使用> 
    [打开-<使用>- 关闭]
    也就是同一时刻只有一个Sqlite实例被打开. 那么正常打开退出,操作等没有异常呀什么发生,就不会在同一目录下产生一个临时文件或者rollback文件,这个时候也就不提示你锁定了.

    Sqlite 自己带的事务琐 貌似不好用, 我在一个循环里面不挺的尝试上百次以后居然就进去了.
    这个时候我另外一个事务 我还没有放开呢. 晕呀.

    <
    <
    哈哈,支持SQL-99标准 就不错了. 下次我也找个项目运用一下.
    而且是脱胎于Borland公司,没有理由不支持.问这个的原因 是有个叫 Berkeley DB 的东东是API接口调用的。 不支持SQL.
    它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
    很容易被锁定的。问一下楼主,问题解决了吗?

    我也遇到类似问题,经常数据库会卡住很长时间,大于5分钟。关注一下,准备用这个东东呢.问题解决了,是资源释放的时候,没有释放干净。
    sqlite3_finalize(sql_stmt);加入这条语句后就好了给分了,参与的都有分啊,大家平分一下

  • Filed under: C++ Builder
  • 本人程序基本结构是这样:
    主线程(应用程序)+子线程;主线程使用一个Sqlite实例,每启动一个子线程后子线程都会自己单独创建一个Sqlite实例,给子线程使用;
    现在问题是:
    当子线程在同时读写数据库时,主线程对数据库进行了大量的修改后,主线程会忙几秒钟。主线程恢复正常后,子线程会出现2-4条insert语句和select语句错误,错误提示都为"database is locked"。请问有什么好的方法能避免这种状况的发生吗?
    我在Sqlite中使用了互斥量进行加锁和解锁;小弟分数不多,在这里全给了,忘朋友们帮帮忙,谢谢!Sqlite多线程操作不太可靠.且效率低下,以前测试过,它只适合单机单线程的简单应用
    如果你真的是用于应用而非个人测试.建议使用Embedded Firebird,它与BCB配合开发桌面应用,方便又可靠且效率是我在桌面数据库测试中最高的.木用过Sqlite
    不知道Sqlite自身有没有事物、锁的概念
    不过对于数据库如MSSQL、Oracle等,最好调用数据库本身的事物和锁 
    Sqlite 的句柄不可以跨线程传递.
    你要线程就要自己封装.

    而且 这个数据库 在批量数据操作时候使用不使用事务效率相差很大Embedded Firebird 支持SQL吗?

    <
    有人封装过<使用> 
    [打开-<使用>- 关闭]
    也就是同一时刻只有一个Sqlite实例被打开. 那么正常打开退出,操作等没有异常呀什么发生,就不会在同一目录下产生一个临时文件或者rollback文件,这个时候也就不提示你锁定了.

    Sqlite 自己带的事务琐 貌似不好用, 我在一个循环里面不挺的尝试上百次以后居然就进去了.
    这个时候我另外一个事务 我还没有放开呢. 晕呀.

    <
    <
    哈哈,支持SQL-99标准 就不错了. 下次我也找个项目运用一下.
    而且是脱胎于Borland公司,没有理由不支持.问这个的原因 是有个叫 Berkeley DB 的东东是API接口调用的。 不支持SQL.
    它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
    很容易被锁定的。问一下楼主,问题解决了吗?

    我也遇到类似问题,经常数据库会卡住很长时间,大于5分钟。关注一下,准备用这个东东呢.问题解决了,是资源释放的时候,没有释放干净。
    sqlite3_finalize(sql_stmt);加入这条语句后就好了给分了,参与的都有分啊,大家平分一下

  • Filed under: C++ Builder
  • 要求直接在查询出来的数据表里用鼠标点就可以修改!

    还有,怎么让DBGRID的表格可以根据窗口的大小自动调整!!!你应该好好找本delphi或者bcb的书看看。怎么让DBGRID的表格可以根据窗口的大小自动调整!!!

    …复杂点,就是自己写坐标。简单点就是把DBGRID的Align属性,调成alClient

    要求直接在查询出来的数据表里用鼠标点就可以修改!

    …简单的呢,就摆个DBNavigator控件,跟DBGrid指向同一个Datasource,DBGrid的ReadOnly属性为false,就在DBGrid上改,用DBNavigator控件上的按钮就保存了"要求直接在查询出来的数据表里用鼠标点就可以修改"
    默认的就是Edit状态 双击后就可以修改的不可以改的。得加代码的吧,我试过的!!ADO,Table,Query我都用过,都可以直接修改,你的怎么就不可以?
    设置DBGrid的Align可以随窗体改变成改变,或者自己在Form的Onpaint里面写代码设置坐标和长宽

  • Filed under: C++ Builder
  • typedef struct in_addr {
    union {
    struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;
    struct { unsigned short s_w1,s_w2; } S_un_w;
      unsigned long S_addr;
    } S_un;
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

    typedef struct IP_HEADER{
    unsigned char VIHL; // Version and IHL
    unsigned char TOS; // Type Of Service
    unsigned short TotLen; // Total Length
    unsigned short ID; // Identification
    unsigned short FlagOff; // Flags and Fragment Offset
    unsigned char TTL; // Time To Live
    unsigned char Protocol; // Protocol
    unsigned short Checksum; // Checksum
    struct in_addr iaSrc; // Internet Address - Source
    struct in_addr iaDst; // Internet Address - Destination
    }IP_HEADER, *PIP_HEADER;

    typedef struct TCPHdr{
      unsigned short src_port; /*Source port*/
      unsigned short dst_port; /*Destination port*/
      unsigned long seq_num; /* sequence number */
      unsigned long ack_num; /* acknowledgement number */
      unsigned char offset_x; /* offset and reserved */
      unsigned char x_flags;
    #define TH_FIN 0×01
    #define TH_SYN 0×02
    #define TH_RST 0×04
    #define TH_PSH 0×08
    #define TH_ACK 0×10
    #define TH_URG 0×20
      unsigned short window; /* window */
      unsigned short chk_sum; /* checksum */
      unsigned short urg_ptr; /* urgent pointer */
    }TCPHdr,*PTCPHdr;

    ………
    ………

    #define IP_OFFSET 0×0E

    //IP Protocol Types
    #define PROT_ICMP 0×01
    #define PROT_TCP 0×06
    #define PROT_UDP 0×11

    PUCHAR pPacketContent = NULL;

    if(pPacketContent[12] == 8 && pPacketContent[13] == 0 )
    {
      PIP_HEADER pIPHeader = (PIP_HEADER)(pPacketContent + IP_OFFSET);
      PTCPHdr pTCPHdr;
      unsigned char tcp_hen;

      unsigned char version = pIPHeader->VIHL >> 4;
      unsigned char ip_hlen = (pIPHeader->VIHL & 0×0f) * 4;

      pTCPHdr = (PTCPHdr)((unsigned char *)pIPHeader + ip_hlen);
      tcp_hen = (pTCPHdr->offset_x >> 4) * 4;
      KdPrint(("version is:%i",version));
      KdPrint(("ip header length is:%i",ip_hlen));
      KdPrint(("ip packet length is:%i",pIPHeader->TotLen));
      KdPrint(("TTL is:%i",pIPHeader->TTL));
      KdPrint(("Protocol is:%i",pIPHeader->Protocol));
      KdPrint(("source ip address is %i:%i:%i:%i",pIPHeader->iaSrc.S_un.S_un_b.s_b1,pIPHeader->iaSrc.S_un.S_un_b.s_b2,pIPHeader->iaSrc.S_un.S_un_b.s_b3,pIPHeader->iaSrc.S_un.S_un_b.s_b4));
      KdPrint(("destination ip address is %i:%i:%i:%i",pIPHeader->iaDst.S_un.S_un_b.s_b1,pIPHeader->iaDst.S_un.S_un_b.s_b2,pIPHeader->iaDst.S_un.S_un_b.s_b3,pIPHeader->iaDst.S_un.S_un_b.s_b4));

      switch(pIPHeader->Protocol){
      ………
      ………
      case PROT_TCP:
    KdPrint(("Source Port is %i:",pTCPHdr->src_port));
    KdPrint(("Destination Port is %i:",pTCPHdr->dst_port));
    KdPrint(("Sequence Number is %u:",pTCPHdr->seq_num));
    KdPrint(("Acknowledge Number is %u:",pTCPHdr->ack_num));
    KdPrint(("The length of TCP Header is %i:",tcp_hen));

    break;
      }
    }
    求助数据包分析。
    情况是这样的:能够正确的打印出IP头内的信息,但是无法打印出正确的TCP头信息,比如http的话,端口应该是80,但是打印出的端口信息中,没有一个80出现,却经常出现这样一些东西,如:
    00001141 191.33653259 version is:4
    00001142 191.33659363 ip header length is:20
    00001143 191.33665466 ip packet length is:56325
    00001144 191.33670044 TTL is:64
    00001145 191.33671570 Protocol is:6
    00001146 191.33674622 source ip address is 74:125:127:99
    00001147 191.33677673 destination ip address is 10:0:2:15
    00001148 191.33680725 Receive TCP packet
    00001149 191.33683777 Source Port is 20480:
    00001150 191.33685303 Destination Port is 12292:
    00001151 191.33688354 Sequence Number is 549814785:
    00001152 191.33691406 Acknowledge Number is 455141922:
    00001153 191.33694458 The length of TCP Header is 20:
    00001154 191.33703613 version is:4
    00001155 191.33706665 ip header length is:20
    00001156 191.33708191 ip packet length is:32514
    00001157 191.33712769 TTL is:64
    00001158 191.33714294 Protocol is:6
    00001159 191.33717346 source ip address is 74:125:127:99
    00001160 191.33718872 destination ip address is 10:0:2:15
    00001161 191.33723450 Receive TCP packet
    00001162 191.33724976 Source Port is 20480:
    00001163 191.33728027 Destination Port is 12292:
    00001164 191.33732605 Sequence Number is 3570041345:
    00001165 191.33734131 Acknowledge Number is 455141922:
    00001166 191.33737183 The length of TCP Header is 20: 求解答啊求解答没人理我。。。(:

    谢谢楼上,不过这些操作是在NDIS中间层进行的,SOCKET肯定没法用加上14是因为MAC地址和链路帧协议类型共十四位,switch语句里已经对UDP、IMCP等作出判断了,不过上述代码中没写出来十四字节,打错了typedef struct _TCP_HEADER
    {
      WORD src_port; /*Source port*/
      WORD dst_port; /*Destination port*/
      DWORD seq_num; /* sequence number */
      DOWRD ack_num; /* acknowledgement number */
      BYTE offset_x; /* offset and reserved */
      BYTE char x_flags;
      WORD window; /* window */
      WORD chk_sum; /* checksum */
      WORD urg_ptr; /* urgent pointer */
    } TCPHdr,*PTCPHdr;

    这个结构是20位的,建议 DEBUG 一下,引用后,找到这个结构体,看看 80 端口的值(50 00)偏移到什么地方了?

    再找是什么原因造成的。

    我就是将截获的数据包保存到ACCESS数据库表内,逐个进行事后分析。
    会不会网络包是采用 TC 或 C51 等软件编写的程序重新封装过了。

    如:C51 对于数值,字节序列是倒过来了,高位在前,低位在后,而BCB 则是低位在前,高位在后

    00001149 191.33683777 Source Port is 20480: 

    端口号是 0×5000 内部字节是 00 50, 如果以 C51 读取,则是 80 端口。BCB读取就是 20480 了。

    谢谢sczyq,立马进行尝试结贴,确实是网络字节序和主机字节序的问题,感谢sczyqgood job

  • Filed under: C++ Builder
  • Q1:界面已经设计好了 但是run之后如果我想最大化的话 界面虽然变大 但排列只是随着到了右上角 其余的地方都是空的 
      想请问 这个格局怎么处理 最大化后能不能界面的按钮之类的也随之变大 或者平铺 居中也行…

    Q2:请问edit只允许输入AnsiString类型的数据么? 
      是这样 我想在几个edit里面输入数字 之后利用一个BUTTON键计算 可是这个计算特别复杂 现在就不会做了…(里面有log函数 它好像只接受double类型的数据)

    请各位大哥大姐帮助…谢谢了1.在界面上放几个TPanel设置它的Align属性设计布局。
    2.TEdit就是输入字符串的,你可以用StrToInt等转换数字字符串为整数等数据类型。<
    改好了 

    把界面上所有的组件选好 之后在ancrohs中 所有的方向都选择false就好了 anchors…用c函数atoi(edit->Text.c_str())转换为整形比较安全,如果用StrToInt()的话当你的edit为字母时会抛出异常!而atoi/atof则会默认为0!<
    还是想问下 我想做的公式特别复杂 又有练加号 又有log 之类的 所以得用double型的数 
    这方法好像不能将类型转换成double型吧? 还得请您指点…
    double型就是浮动性,用ToFlot就可以了!!恩,很不错的啦,帮顶

    <
    我想做的是算出 lg(在Edit中输入的数) 就算这个小公式…

    请高手再指点一二用log(StrToDouble(XX))行么?XX代表需要计算的变量…<
    ansisting转double 
    代码: 

    void __fastcall TForm1::Button1Click(TObject *Sender) 

    AnsiString Test = "123"; 
    long double d = StrToFloat( Test ); 

    and 结贴!http://hi.baidu.com/_kaixi_2/blog/item/e7eaf19b2272f1b1c8eaf449.html

  • Filed under: C++ Builder
  • Q1:界面已经设计好了 但是run之后如果我想最大化的话 界面虽然变大 但排列只是随着到了右上角 其余的地方都是空的 
      想请问 这个格局怎么处理 最大化后能不能界面的按钮之类的也随之变大 或者平铺 居中也行…

    Q2:请问edit只允许输入AnsiString类型的数据么? 
      是这样 我想在几个edit里面输入数字 之后利用一个BUTTON键计算 可是这个计算特别复杂 现在就不会做了…(里面有log函数 它好像只接受double类型的数据)

    请各位大哥大姐帮助…谢谢了1.在界面上放几个TPanel设置它的Align属性设计布局。
    2.TEdit就是输入字符串的,你可以用StrToInt等转换数字字符串为整数等数据类型。<
    改好了 

    把界面上所有的组件选好 之后在ancrohs中 所有的方向都选择false就好了 anchors…用c函数atoi(edit->Text.c_str())转换为整形比较安全,如果用StrToInt()的话当你的edit为字母时会抛出异常!而atoi/atof则会默认为0!<
    还是想问下 我想做的公式特别复杂 又有练加号 又有log 之类的 所以得用double型的数 
    这方法好像不能将类型转换成double型吧? 还得请您指点…
    double型就是浮动性,用ToFlot就可以了!!恩,很不错的啦,帮顶

    <
    我想做的是算出 lg(在Edit中输入的数) 就算这个小公式…

    请高手再指点一二用log(StrToDouble(XX))行么?XX代表需要计算的变量…<
    ansisting转double 
    代码: 

    void __fastcall TForm1::Button1Click(TObject *Sender) 

    AnsiString Test = "123"; 
    long double d = StrToFloat( Test ); 

    and 结贴!

  • Filed under: C++ Builder
  • 1我想从xls文件把数据导入到DataGridEh中行不行。
    2我希望DataGrid第一列是像checkbox,提供勾选,勾中代表用户选了这条记录,这样
    怎么实现?1、需要從數據庫獲取
    2、在DBGridEh1的第一列的屬性里 把CheckBoxes設置成true 
    第一列就會顯示 CheckBox了xls文件可以作为数据库文件用只要能到dataset就能用。

  • Filed under: C++ Builder
  • 小弟刚用C++   ,请问怎样才能想把一个数据追加到一个文件的尾部而不是覆盖.sf打开文件时以追加方式即可fopen(filename, "ab ");
    函数申明:   FILE   *fopen(char   *filename,   char   *mode)    
    函数用途:   打开一个文件    
    头   文   件:   stdio.h  
    输入参数:   filename:   文件名称
    mode:打开模式,含义具体如下:
    "r ":只读方式打开一个文本文件       "rb ":     只读方式打开一个二进制文件
    "w ":只写方式打开一个文本文件       "wb ":     只写方式打开一个二进制文件
    "a ":追加方式打开一个文本文件       "ab ":     追加方式打开一个二进制文件
     
    "r+ ":可读可写方式打开一个文本文件             "rb+ ":     可读可写方式打开一个二进制文件
    "w+ ":可读可写方式创建一个文本文件             "wb+ ":     可读可写方式生成一个二进制文件
    "a+ ":可读可写追加方式打开一个文本文件     "ab+ ":     可读可写方式追加一个二进制文件  
    返   回   值:   文件指针,如返回为NULL,表示打开失败楼上说了。#include   <fstream>

    int   main()
    {
            using   namespace   std;

            fstream   log( "log.txt ",ios_base::out   |   ios_base::app);
            log   < <   "app "   < <   endl;
            system( "notepad   log.txt ");
    }mark明天给分,今天自己实验下弄出来了.给分ios_base::out | ios_base::app

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档