• shoit gg,偶可不可以大声说一句"偶好喜欢你了"。

  • 2007-03-19

    懒人

    我懒人一个,就知道睡觉,躲在被窝里再也不愿意下来了。shoit gg啊,又要帮偶关电脑了,呜呜。一要睡就再也醒不来了。依~真是讨厌,不是睡觉就是不做东西。

  • 2007-03-17

    偶今晚努力

    今晚偷偷努力好了,xml要处理的异常情况很是麻烦。
  • 2007-03-13

    麻烦

    心情很糟糕,我有感觉我们的项目没有希望了,读不出数据就是读不出来。

    外面的世界很吵,吵得我有些烦恼。

  • 今天发现xml里面的所谓坐标根本不是坐标,噩梦了。还有原本的图像经过加密或者压缩的,shoit测试过了,就是现在怎么导出结果一头雾水,原先担心的问题终于出现了。惨了。
  • 2007-03-01

    最近进度

    今天见了组长、weipeng,我写那部分主要就是动态生成数据库和写入xml用来打开设计表或者统计表,还有一些细微的bug今天完成。和组长的合作很方便,因为统一了变量和结构体,代码copy过去就可以运作。

    整个项目还有anoto笔的数据获取、图像识别、print功能这三个重要的部分没有实现,而且是比较麻烦我们没有头绪的部分,还有一个月时间,要抓紧时间互相督促了。

    ...
  • 2007-02-27

    高手

    阿蕾今晚搞掂了个vs2005,还搞掂了厕所的灯,佩服佩服。
  • 谢谢shoit的帮忙,知道大概的功能是怎么操作的了。

    现在开始数据库的读出怎么和佳州接口做好了,不知道他的类变量是怎样写的,存储、完成、数据库调入的函数和接口没有商量过,那个类是怎样的也没有说,等下要讨论清楚。然后用datagrid来显示,不知道和他们想的有没有冲突,开始是说类似word的东西,试试先,用datagrid显示后,怎么保存这些结果呢。

  •       今天是新的开始了,在安装sql server 2005前心痛地把3DMAX 7.0 & 8.0删掉了,因为c盘空间不足。那两个软件陪伴了我差不多一年,删的时候有点舍不得。

           安装完sql server 2005就动态创建了一个数据库,现在想想怎么添加删除属性,然后再来搞个对话框将五种问题试试放进表里面,争取和佳洲他们的问卷在回家前合在一起。

           今天参加ic的软件设计联机会议,挺好玩耶,恩,界面为线索这个是听到的给我们启发比较大的经验。参见小黄哲以前crazy rocket的日程,确定2个月的大致日程和5天内要完成的工作,进展还好。开完会忽然觉得时间紧迫,一下子紧张了。

           然后佳洲和纬鹏今天把笔拿回来,我们所需硬件和sdk到手,不用整天猜那支笔究竟有什么功能了。

           和阿蕾搬到一个宿舍,讨论也方便,不懂也不用那么郁闷。shoit要被我们两个一起烦了,看来。

  • 2007-01-24

    what is promise

        Like Jack , for many things I didn't keep my promise.Maybe it is not my falut ,but still i feel upset. Now , i can't see my future yet .Maybe I should work harder , because many people have their own plans and i haven't trying my utmost to fullfil my goal. Every minute is treasureable. I can't keep promise for so many people , but still i can keep it for myself .
        Wish to go home so bad .Wanna breathe the air , taste the smell , drive my bike around the town. I miss the kids , miss my families, miss....
        Sometimes to be cruel is a way to escape , i understand , and maybe this is what i am doing . Is that something which is the last thing you are certain about is actually something you would never change , is that someone who changes frequently is actually someone who never changes inside? Life is a gamble ,but i am not a faithful gambler.
        Whatever, just keep going , chasing the dream ,caring the people and being cared by the people i love.
  • 2006-12-21

    exp3

    昨晚写网络实验3有点沮丧,一时情绪无法控制,一声不吭就下线关了所有的程序窗口。因为每个人都说实验3很简单,老师的代码就可以搞好了。我弄了一个晚上客户端都卡在登陆那里,再运行一下连服务器bind都bind不到端口,无语。。。

    我昨晚都在想不用线程好像会死循环,连个窗口都不出来可能就是卡在OnInitDialog里面了。今天下午改一下用一个线程,恩,行了,实现了单线程!可是,多线程还是卡~ 这次有经验了,是读写那里我还没有把循环去掉,select自己会选择需要接收发送的socket的。一改,行左!

  • 2006-12-21

    Hope to be simple

    For my recent state,there is something must be clarified.First ,the most importan thing is I have to get a better score in my final exam.I don't want to be a post_graduate student any more.But the first qualification for going out is GPA.So , i have no choice but to be smart in my exam.  

    Then, the D3D study will continue to be a very important one ,because i have a promise with igame.Both of us are expecting the Engine for the mobile device.The schedule will include the part in the following few days.The dead line will be the end of December.Seems that I can't catch up with him now at this stage. I can see his progress in OGRE, but he can't see my progress in D3D.

    There is one more thing for the imagine cup. Becase some historical reasons, i am involve in the team of SDI (sofeware design invitational).The reason is that i have ever promised the other three people that I will let them involve in the CA software group and develope in the winter vacation.But igame's organization is different for what i expected.I don't want to break my promise .So we four form a team to challenge the competition.But of course , i won't be important in this team,because time is inadequate.

    I don't want to surmerge in the homework all day .Igame said that just be quick and let your brain be concious all the time. I find it hard .T0o quick will make me dizzy.Thanks for shoit's help.

    This Saturday DR.zhang said he will bring us to a company for a visit ,something relates to 3G network .I want to have a look , because it is related to embedding technology...

    All right , hold on .

  • 怎么说shoit给我找出来的这部分是最重要的,这些我再花几个通宵都发现不了的bug喔。写在前面^_^,当后面那些废话,记录一下而已。

    1, afxInitRichEdit2()
    2, Info.mdb 加 ID 字段
    3, ServerDlg.cpp CServerDlg构造函数加  global_dlg = this;
    4, LogDlg.cpp的CLogDlg::OnBnClickedOk()函数
     if(strcmp(confirm_buf,"登陆成功")==0)
     改成
     if(strstr(confirm_buf,"登陆成功")!=0)
     或者自己构造个"用户名+登陆成功"的语句比较。

    5, ChatDlg.cpp的CChatDlg构造函数
     c_Thread=::AfxBeginThread(C_recv,&global_lable->sock);
     改成
     c_Thread=::AfxBeginThread(C_recv,this);
    6, ServerDlg.cpp的析构函数 ~CServerDlg() 改这样:
     while(cur!=NULL) {
      Node *tmp = cur;
      cur=cur->next;
      delete tmp;
     }

    7, 注册相关的
     SignDlg.cpp里的OnBnClickedRefresh()函数
     global_sign=new Node;前添加
     #define WSVERS  MAKEWORD(2, 0)
     WSADATA wsadata;
     if (WSAStartup(WSVERS, &wsadata) != 0)   /* 启动某版本的DLL */
     {
      ::AfxMessageBox("WSAStartup failed");
      return;
     }
     另global_sign->sock=connectTCP((char*)(LPCTSTR)m_signIp,"5051");
     改global_sign->sock=connectTCP((char*)(LPCTSTR)m_signIp,"5050");
     并把该函数内的所有global_lable改成global_sign

    8, 界面相关. ServerDlg的OnInitDialog() 加
     m_recv.MoveWindow(24,129,425,351);
     m_send.MoveWindow(15,537,438,52);
    9, 其他server的connect.cpp
     ser_send_recv()函数后边改了显示格式
     char msg[256];
     sprintf(msg,"%s说:%s\n",((Node*)lpParam)->name,buf);
     show_message(msg);

    以下废话部分:

    1、关于网络部分: 

    说真的,这部分真的超级郁闷。因为加入了数据库的验证,需要考虑用户注册和用户登录两个部分,不但要考虑信息的获取、发送,还要处理服务器的信息返回。

    因为用的是APIsend函数,所以信息的发送都是用char的字符。

    ü         首先处理服务器和客户端的连接问题,这个不是很难,设置好端口和获得ip地址连接就没有问题。接着,就是多线程问题了。服务器在chat_dlg建立一个ser_accpet的线程,这个线程的作用就是为每个登陆用户建立一个线程,再在这个线程派生一个收发线程ser_send_recv

    ü         为了保存登陆用户的用户名信息和对应的socket,每次有一个用户登录都new 一个节点,用户退出都delete那个节点。Delete的工作很繁琐,包括指针的操作,特别是头尾指针这些。还有原来关闭socket还有一番功夫,首先要shutdown,然后要closesocket,再delete;这个网上叫做a delegate way to close socket

    ü         然后要处理,CStringchar的转化,因为从对话框得到的都是CString。简单的办法就是char*(LPCTSTR)。这些用户信息到了服务器端的时候,因为设计失误,数据库类DataAccess,里面的接口都是CString,所以又要把从客户端发来的信息再转为char。虽说简单,可是先接收在buf再定义CString来转化,工作量也很大。

    ü         发送信息要让服务器区分是登陆信息、还是注册信息、还是普通的聊天信息。所以要在服务器和客户端有对应的消息影射,比如:登陆是login,注册是enroll,成功注册就是注册成功,要对应好。这里最麻烦的就是出错信息,出错的种类很多,比如,用户名重复、密码错误、用户名不存在、用户已经登陆,这些错误要一个一个写在else if 就烦人。

    ü         因为可能是设计问题,登陆和注册要分别连接服务器,这样就要在登陆和注册对话框都要建立socket

              if (WSAStartup(WSVERS, &wsadata) != 0)   /* 启动某版本的DLL */

              {

                  ::AfxMessageBox("WSAStartup failed");

                  return;

    }这一段代码每次都忘记。

    然后再建立连接。

    global_lable=new Node;

              global_lable->sock=connectTCP(host,"5050");

    ü         Send函数还有一个比较奇怪的现象,就是如果几个send函数一起发东西的话,recv会一次过接收。这样用户的注册信息就会有麻烦了。开始没有想到有这个问题,发现后才把GetDlgItemText差在每一个send中间,才不会出错。

    曾经解决过的问题:

    2error LNK2019: unresolved external error LNK2005 error LNK2056连接问题大概就是这三类,error LNK2005最常见,一看就知道是重定义了。害我找了很久知道定义变量要在cpp里面定义,然后在其他要引用的地方用extern来调用。涉及Node的调用要用整个Node都要写一次,像这样:

    extern struct Node{

         char name[30];

         SOCKET sock;

    };这类extern在每次调用的时候都要写,全局变量一多,或者引用的头文件多,就比较烦。

    而函数则要在一个.h里面declare,在cpp里面define,在需要调用函数的地方include这个.h文件就行了。不然如果没有这个.h,就会出现很多重定义,因为如果包含的是cpp,每一次include都会重新编译。

    然后就是LNK2019,这个我出现是因为写的函数实在太多了,有些函数只在.h里面declare就在类里面调用了,没有写实现,就会出现这个LNK error.

    还有连接错误就是在一些类的头文件没有包含resourse.h,很多IDD_,IDC_这类东西找不到。比较奇怪的就是,在添加类的时候,mfc有时候会自动#include “resourse.h”,有时候又没有。

    3、数据库部分:

           这是我第一次操作数据库,所以虽然别人说数据库是很简单的东西,特别是ADO编程,我就觉得很难。我们书上有的都是ODBCDAO的,好像不是很通用的样子,而且看了不是很懂,用ODBC里面的用户DSN数据库是针对本机的,而可以在其他机上运行的书上没有说。所以选择了ADO

    ü         首先,在DataAccess类头部加入:

    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "ENDOFFILE")

    ü          定义两个重要的变量

    _RecordsetPtr m_pRecordset;

    _ConnectionPtr m_pConn;

    在每一次对数据库进行读写操作之前都要进行一系列的初始化:

    //初始化Com对象

    CoInitialize(NULL);

    //初始化连接对象

    m_pConn.CreateInstance(ADODB.Connection);

    m_pRecordset.CreateInstance(ADODB.Recordset);

    m_pConn->Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=res\\Info.mdb;Persist Security Info=False,””,””,adConnectUnspecified);

    ü          获得数据

    strSQL.Format("%s\"%s\"","Select * From BASIC Where NAME like ",

             UserName->GetBuffer(UserName->GetLength()));

             //打开指定记录集

             m_pRecordset->Open(_variant_t(strSQL.GetBuffer(strSQL.GetLength())),

                                _variant_t(m_pConn,true),

                       adOpenStatic,adLockOptimistic,adCmdText);

    ü          加入数据:    m_pRecordset->PutCollect

    取得数据:    m_pRecordset->GetCollect

    用到的操作大概就是这些,因为时间关系没有加密用户名和密码。

     

    4、关于界面:

    b)        包含了两个文件:CDialogSK.h CDialogSK.cpp在工程里面,这是一个在网上比较流行的一个支持换肤的两个文件,使用的步骤如下:

    ü         在工程加入CDialogSK.hCDialogSK.cpp

    ü         在对话框类中包含CDialogSK.h

    ü         在你的对话框类中用CDialogSK代替所有的CDialog

    ü         在对话框类的OnInitDialog的结尾处,加入CDialogSK属性方法的调用:

    EnableEasyMove();

    SetBitmap(IDB_CHAT)

    SetStyle(LO_RESIZE);

    SetTransparentColor(RGB(0,255,0);

    这个方法解决了界面闪烁的问题,将放置控件的地方挖空,并且支持对话框的移动。

    c)        然后就是那个聊天界面了,其实是参考shoit以前给我看过的一个多媒体作业的方法,用的是GDI+Image类。步骤就是:

    ü         在对话框的头文件加入#include<gdiplus.h>  using namespace Gdiplus

    ü         在构造函数里面加入

    ULONG_PTR m_gdiplusToken;

    GdiplusStartupInput gdiplusStartupInput;

    GdiplusStratup(&m_gdiplusToken,&gdiplusStartupInput,NULL)

    ü         然后大部分用这段代码

    Graphics graph(GetDC()->m_hDC);

             Image img_login(L"res\\login_on.bmp");

    graph.DrawImage(&img_login,17,28);

                  就可以在OnMouseMove OnLButtonDown设置变化的图标了

    d)        界面是我用photoshop自己的设计的,嗯嗯,个人感觉色调还好啦。

  • shoit问我:“其实你做东西是不是都一边睡觉一边做的~~^^。”我怎么说,大概就是那样,因为这次自己一个人试着去做暑假三个人的东西,我的耐性真的到了极限了,太多函数太多变量。最重要的是开始没有设计好函数的接口、界面的切换、程序的结构,搞到后面自己一看那个程序都觉得发麻。幸好,shoit有那样的耐心帮我改了一个下午,小香说:“你那个程序居然有人能改好。”我不知道shoit是怎么我设的函数变量弄清楚d,感动~~,我上AI的时候走神时候想如果shoit没有帮我改的话,我就放弃它了。依~~回来,竟然说还有一点点就改好了,虽然心里觉得shoit帮我弄了一个下午有点不好意思,但是还是感到舒心的喜悦,不用扔掉这个做了那么多天的程序。

    不过他发现的那些错误都是很难为人的错误。比如:

    shoit说:“注册那里,,有个地方传"注册成功!"回来,,然后client判的是"注册成功"..看了好久才发现少了'!'..@@”。。。。。还有,server的InitInstance()里忘了加 AfxInitRichEdit2();~加了就有对话框了~暑假的时候跟你说过的哦~ 。。。。还有,c_Thread=::AfxBeginThread(C_recv,&global_lable->sock);改成 c_Thread=::AfxBeginThread(C_recv,this);。。。。诸如此类的错误,就是昏昏入睡的人才能搞出来的那种错误,要找出来真的为难他了。