这种情况,链表该怎么设计

绿豆蛙2013 2009-08-22 08:47:48
一共有三个操作:接收、保存、绘图

想利用链表来存放接收的数据,然后从这个链表中取出来数保存、绘图完,然后再删掉这个节点。

struct RecvData
{
char recvbuffer[20];
RecvData *next;
};


按理说,数据是先保存,然后绘图,保存只是从链表中取数,绘图完之后删掉节点。这样就有个问题,因为我只要一拖动窗口,就会触发绘图响应OnPaint。所以这样的话,有可能数据还没有保存,就被删掉了。

所以,我进行了一下改进:

struct RecvData
{
BOOL Dealed;
char recvbuffer[20];
RecvData *next;
};


Dealed用来表示有没有处理过,处理过则为FALSE。如果先保存了,变成了FALSE,绘图的时候如果是 FALSE,则绘完图删掉该节点;如果先绘图了,变成了FALSE,保存的时候如果是 FALSE,则保存完删掉该节点。

这下又有了问题,如果我连续拖动了两次窗口,则连续执行了两次绘图,绘完图把节点删掉了,还没有保存就删掉了,又出了问题。


是不是要设两个标志呢?
struct RecvData
{
BOOL Drawed;//是否已绘图
BOOL Stored;//是否已保存
char recvbuffer[20];
RecvData *next;
};
当两个标志都为TRUE的时候,删掉节点。

小弟链表学的不咋地,还请高人多多指点,谢谢
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
candy_2003 2009-08-23
  • 打赏
  • 举报
回复
利用C++标准库里面的向量vector.如果是处理已经知道的类型,如MFC封装的矩形类CRect,那么可以这样定义vector<CRect> V_Crect.如果是没有的类型,可以定义一个结构,或类.然后定义它的向量,比如定义了一个直线类CLine,那可以定义一个向量vector<CLine>V_CLine.这样你就可以处理无限个数据,可以调用向量封装的删除,插入,查找等操作.
MoXiaoRab 2009-08-23
  • 打赏
  • 举报
回复
设置一个全局变量,bMoving,在WM_MOVING的时候将它设置为TRUE,WM_MOVE的事件函数中将它设置为FALSE,表明拖动结束

窗口的移动过程激发了无数个WM_MOVING,在移动的最后激发WM_MOVE

在Onpaint中根据这个拖动标志来做,会了吗?
晒月光的青蛙 2009-08-23
  • 打赏
  • 举报
回复
用两个标志?这样肯定是不行的,因为可能拖动n次
你删除的时间应该选在下次数据到来的时候,才删掉上次显示的数据
  • 打赏
  • 举报
回复
要是单线程的话,就不用考虑保存跟绘制的同步了。
多线程的话做好同步就没问题了
Conry 2009-08-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 lzh19840809 的回复:]
一共有三个操作:接收、保存、绘图

想利用链表来存放接收的数据,然后从这个链表中取出来数保存、绘图完,然后再删掉这个节点。

C/C++ codestruct RecvData
{char recvbuffer[20];
RecvData*next;
};

按理说,数据是先保存,然后绘图,保存只是从链表中取数,绘图完之后删掉节点。这样就有个问题,因为我只要一拖动窗口,就会触发绘图响应OnPaint。所以这样的话,有可能数据还没有保存,就被删掉了。

所以,我进行了一下改进:

C/C++ codestruct RecvData
{
BOOL Dealed;char recvbuffer[20];
RecvData*next;
};

Dealed用来表示有没有处理过,处理过则为FALSE。如果先保存了,变成了FALSE,绘图的时候如果是 FALSE,则绘完图删掉该节点;如果先绘图了,变成了FALSE,保存的时候如果是 FALSE,则保存完删掉该节点。

这下又有了问题,如果我连续拖动了两次窗口,则连续执行了两次绘图,绘完图把节点删掉了,还没有保存就删掉了,又出了问题。


是不是要设两个标志呢?
C/C++ codestruct RecvData
{
BOOL Drawed;//是否已绘图 BOOL Stored;//是否已保存char recvbuffer[20];
RecvData*next;
};当两个标志都为TRUE的时候,删掉节点。

小弟链表学的不咋地,还请高人多多指点,谢谢
[/Quote]
这跟链表没关系,是你的处理逻辑有问题
看你的意思你的数据就画一次,然后就丢掉,
那么你就先从链表取出,画图,然后丢给另一个链表,保存的就从后边的链表取,保存完删除

说实在的,还是不太懂你的意思
luckyboy101 2009-08-22
  • 打赏
  • 举报
回复
貌似看不太懂
你把要绘制的数据放入链表就行了,在OnPaint里绘制链表中的数据就可以了
链表可以用CList模板实现

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧