最新评论
您好,看了这篇link server的建立,获益匪浅。
有一个问题想问一下:
用openquery分布式操作sql server和oracle时候,是否可以作为同一个事务进行rollback?
谢谢!
re: 重构啊重构 ^_^ 2007-11-30 11:05
难道一大堆get,set就叫做面向对象吗?如果要从容器里面取出大量数据,是不是要通过中间对象容器传递,有时候过分对象也是有害的。lz写个邮件给我,may be我们一伙的。邮箱你能看到,^_^
re: 基线由谁负责? 在路上 2007-06-16 19:28
lz对基线的概念理解有误吧
基线是基准的意思,基线可能是一个需求,可能是一个release版本
re: 团队建设之路(2) ttyp 2006-10-31 14:16
这叫团队么?要以人为本,不要为了管理而管理,这样的公司一天也不想呆
re: [实用源码] 线程安全/竞争读写的先进先出队列 lmeiqiu@sina.com 2006-10-05 17:37
呵呵,抱歉问了弱问题。原来Monitor.Wait会释放oReadLock并重新等待。
我用“使用Monitor的Fifo类源码”运行测试,在程序运行一定时间后会产生异常,提示为不能在Queue为空的时候dequeue。
re: [实用源码] 线程安全/竞争读写的先进先出队列 lmeiqiu@sina.com 2006-09-27 18:24
正好是我在搞的:)不过对C#中的lock疑问很多,冒昧问问。
pop()中
lock(oReadLock)
{
while(m_iCurrentCount<=0)
Monitor.Wait(oReadLock, Timeout.Infinite);
}
和push()中
lock(oReadLock)
{
Monitor.Pulse(oReadLock);
}
都用了lock(oReadLock) ,显然pop()先运行到了Wait难道这个lock只能作用于同一段代码么?mutex在acquire之后其他线程不能再acquire,而lock(obj)我还不明白它能干啥。因为t4Start和t3Start都可以进入lock,并运行到Monitor.Wait(oReadLock, Timeout.Infinite)开始等待。
re: 面试官如何设计面试题? 徐小建 2006-06-22 14:23
挺不错,
看了这些问题,
真的让我深深思考这些在工作中碰到的步骤
或许我也会反省一下,我平时的步骤是否是合理的,
呵呵
re: 解决OCI-22053错误溢出的方法 西煞魄工人1 2006-03-23 13:00
你是亿阳的人!
我也遇见过这个问题,我用的也是round(),有人提议用to_char()也行。
re: 解决OCI-22053错误溢出的方法 mingal 2006-01-05 11:50
谢谢!我是在数据库后台存储过程进行round,:)
在0InitMapXEagleBar()函数里, m_wndMapXEagleBar.Create(this, ID_VIEW_MAPX_EAGLE_BAR, _T("MapX鹰眼图"), CSize(250,250))中,ID_VIEW_MAPX_EAGLE_BAR如何定义,我在ID Resouce symbols中直接定义,但运行错误.请哪为高手指点一下.
请问一下你这个函数OpenWndByDocType("MapXSampleMDI")怎么没有定义呀,能告诉我一下吗?
请问一下,在VC中查询如Area(obj,"sq mi")>1000的语句,该如休写?请各位高手举个例子。
//鹰眼栏
36 if (!InitMapXEagleBar())
37 {
38 TRACE0("Failed to create dialog bar m_wndMapXEagleBar!\n");
39 return -1; // fail to create
40 }
哪有InitMapXEagleBar()) 函数?
re: 重构啊重构 AlleNny 2005-06-18 19:30
唉,项目代码结构失败的典型案例,长痛不如短痛,如果真的结构复杂混乱无法重构,下决心重来吧.
re: 重构啊重构 一颗色儿 2005-06-17 18:02
重写谈何容易,特殊优化的算法技巧,用户已经满意的界面和性能,千万人月调测过的无错代码。
如果选择重写,哪里来的人力和时间?不能抛弃的过去必有其存在的原因,故重构也自有重构的必要理由。
re: 重构啊重构 cannyman 2005-06-17 16:41
重构杂乱无章的代码,比重新写一遍的时间还长,如果是为了项目工期和质量打算最好是重新来!
re: 重构啊重构 AlleNny 2005-06-17 13:03
重构要在过程中反复进行的,等到他庞大无比的时候再重构,还不如推倒重来呢
re: 重构啊重构 补丁 2005-06-17 12:54
呵呵,我觉得能不改的就不改了
因为我现在每半个月之后看当时写的程序就是LJ了(当然,起电太低是主要原因),要是花大力气来修改以前的程序似乎就拖慢了自己前进的步伐了:>
我通常尽量把不愿意改动的程序封装起来,或者用facade/adapter只提供些外部的访问接口,虽然就像把一大堆垃圾打了个包,但是节省了很多时间,而且不致因为考虑不周而出现问题,新的程序也能很好的协同工作
re: 做一个聪明的项目参与者--制订WBS清单 HappyMan 2005-05-25 13:32
先生的做法是值得提倡和善用的
在我們的Team裡工作的安排便是這麼透明的,所有人的工作都做在一個系統裡(最初是都做在一份Excel裡),每個開發人員根據項目經理分配給自已的任務做詳細的進度安排,再每周或每天更新自已的工作進度。
不過我們不是軟件公司,對於軟件的開發速度要求不是很高,所以通常都會把時間支配得比較輕鬆。
但這樣對於項目經理來說,卻是能很容易地做到控制整個專案的開發進度及掌握每個人的開發能力。
項目組裡面每個人都制定了個人的工作計畫,那最好把每天所做的事情都公佈出來--比如寫日誌什麼的,記載自己的工作進度,和一些想法建議,就更好了
朋友,你的文章写得真有见地!
希望多出更好的作品哦~~~
哈。好东西当然要共享啦。
你拿这个WBS给项目经理看了,不就是相当于与整个团队共享了吗?
re: 做一个聪明的项目参与者--制订WBS清单 kwklover 2005-05-24 21:13
如果是一个人偷偷私底下实现这个WBS,是不是有点名则保身的感觉
如果整个tream都这样做,并且把每个人的plan都放到团队门户网站上,管理者,队友都知道大家都在做什么,这样更透明
@Nineteen
我按照你文章的方法试了一下,得到如下测试结果:
Monitor AutoResetEven
CPU占用 45-55 30-35
内存占用 7,000K 10,000K
运行次数 100000 80000
确实使用Monitor比AutoResetEvent效率高不少。
以下是使用Monitor的Fifo类源码(鸣谢Nineteen):
using System;
using System.Collections;
using System.Threading;
namespace eXcel.Fifo
{
/// <summary>
/// 线程安全的先进先出队列 Fifo.cs
/// eXcel Wong 2005-5-24
/// 支持多个读线程和多个写线程同时访问,
/// 当fifo为空时,读线程自动堵塞,直到fifo有数据为止,
/// 当fifo达到最大容量时,写线程自动堵塞,直到fofo有空余为止
/// </summary>
public class Fifo
{
private System.Collections.Queue m_queue; //队列
private int m_iCurrentCount; //队列的当前元素数目
private int m_iMaxCount; //队列的最大元素数目
private object oReadLock=new object(); //读锁
private object oWriteLock=new object(); //写锁
/// <summary>缺省构造函数,队列容量为int的最大值</summary>
public Fifo()
{
m_iCurrentCount=0;
m_iMaxCount=int.MaxValue-1;
m_queue=Queue.Synchronized(new Queue());
}
/// <summary>构造函数,由用户指定队列容量</summary>
public Fifo(int iMaxCount)
{
m_iCurrentCount=0;
m_iMaxCount=iMaxCount;
if(m_iMaxCount<1 || m_iMaxCount>=int.MaxValue)
m_iMaxCount=int.MaxValue-1;
m_queue=Queue.Synchronized(new Queue());
}
/// <summary>往队列插入元素</summary>
public void Push(object o)
{
lock(oWriteLock)
{
while(m_iCurrentCount>=m_iMaxCount)
Monitor.Wait(oWriteLock, Timeout.Infinite);
}
m_queue.Enqueue(o);
Interlocked.Increment(ref m_iCurrentCount);
lock(oReadLock)
{
Monitor.Pulse(oReadLock);
}
}
/// <summary>从队列弹出元素 </summary>
public object Pop()
{
lock(oReadLock)
{
while(m_iCurrentCount<=0)
Monitor.Wait(oReadLock, Timeout.Infinite);
}
object o=m_queue.Dequeue();
Interlocked.Decrement(ref m_iCurrentCount);
lock(oWriteLock)
{
Monitor.Pulse(oWriteLock);
}
return o;
}
/// <summary> 返回当前队列的元素数目 </summary>
public int Count
{
get{return m_iCurrentCount;}
}
/// <summary> 重置队列的最大元素数目 </summary>
public void ResetMaxCount(int count)
{
lock(this)
{
m_iMaxCount=count;
}
}
}
}
re: [实用源码] 线程安全/竞争读写的先进先出队列 Nineteen@newsmth 2005-05-23 10:51
lock(this)
{
Monitor.Wait(...)
...
}
这么进行同步,显然是很疲劳的,不如用信号量来表征队列当中还有多少可读元素,没信号了就等待,有信号就一直读,读到没信号为止。当然,读的时候必须使用读取锁。
看一下www.newsmth.net(水木清华)Dotnet版,精华区,新水木时代-〉原创文章和原创作品-〉Nineteen目录下的《另外一个版本的txt日志记录器》,它在内部实现了一个先进先出的队列,也许那片文章里的同步控制对你有些帮助。
我把Pop方法改成:
public object Pop()
{
object o;
if(m_iCurrentCount<=0)
Monitor.Wait(oRead);
lock(this)
{
o=m_queue.Dequeue();
}
if (Interlocked.Decrement(ref m_iCurrentCount) <= 0)
Monitor.Enter(oRead);
Monitor.Exit(oWrite);
Monitor.Pulse(oWrite);
return o;
}
之后,出现这样的错误提示:
从不同步的代码块中调用了对象同步方法。
请问如何解决?
re: [实用源码] 线程安全/竞争读写的先进先出队列 Nineteen@newsmth 2005-05-22 21:29
ManualResetEvent是相当heavy的线程同步手段,能不用,还是不用的好。可以试试Monitor.Wait和Monitor.Pulse.它们的效率是非常高的,不会比关键字lock差多少。
re: 基线由谁负责? redmoon 2005-05-20 10:23
确实系统分析员应该只应有第一职责。但是中国大部分的软件公司确实越俎代庖