Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

据国外媒体报道,来自国外媒体Neowin网站的消息称,目前,微软已经官方对外发布Windows 7 SP1的RC版本,版本号为windows6.1-KB976932。近段时间,Windows 7 SP1 RC版本的builds不断被泄露到网络中,可能就是由于这个原因微软才不得已提前对外Windows 7 SP1 RC版。

微软今天宣布了 Windows Live Essentials Wave 4 的 Beta Refresh 版,也就是上次预告的 Beta 2。感谢 Damaster,新版 Essentials 安装包已经可以在下面的地址下载。

Windows Live Essentials Wave 4 Beta 2 更新包括:新增 Facebook Chat 的支持、Windows Live 照片库、Writer 和影音制作的一些改进和增强。我会在新文章中介绍,先下载安装吧。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

//
// Thread pool wait callback function template
//
VOID
    CALLBACK
    MyWaitCallback(
    PTP_CALLBACK_INSTANCE Instance,
    PVOID                 Parameter,
    PTP_WAIT              Wait,
    TP_WAIT_RESULT        WaitResult
)
{
    //
    // Do something when the wait is over.
    //
    _tprintf(_T("MyWaitCallback: wait is over.\n"));
}

//
// Thread pool timer callback function template
//
VOID
    CALLBACK
    MyTimerCallback(
    PTP_CALLBACK_INSTANCE Instance,
    PVOID                 Parameter,
    PTP_TIMER             Timer
    )
{
    //
    // Do something when the timer fires.
    //
    _tprintf(_T("MyTimerCallback: timer has fired.\n"));
}

//
// This is the thread pool work callback function.
// The callback demonstrates correct behavior when changing the
// state of the thread inside the callback function.
//
// Any changes to the thread state must be restored to original
// before exiting the callback routine.
//
VOID
    CALLBACK
    MyWorkCallback(
    PTP_CALLBACK_INSTANCE Instance,
    PVOID                 Parameter,
    PTP_WORK              Work
    )
{
    BOOL bRet = FALSE;
    DWORD dwPriorityOriginal = 0;
    //
    // Record the original thread priority.
    //
    dwPriorityOriginal = GetThreadPriority(GetCurrentThread());
    if (THREAD_PRIORITY_ERROR_RETURN == dwPriorityOriginal) {
        _tprintf(_T("GetThreadPriority failed.  LastError: %u\n"),
            GetLastError());
        return;
    }
    //
    // Increase the priority of the thread pool thread.
    //
    bRet = SetThreadPriority(GetCurrentThread(),
        THREAD_PRIORITY_ABOVE_NORMAL);
    if (FALSE == bRet) {
        _tprintf(_T("SetThreadPriority failed.  LastError: %u\n"),
            GetLastError());
        return;
    }
    _tprintf(_T("MyWorkCallback: thread priority increased.\n"));

    //
    // Perform tasks at increased priority.
    //
    {
        _tprintf(_T("MyWorkCallback: task performed at increased priority.\n"));
    }
    //
    // Restore thread state by resetting the original priority.
    //
    bRet = SetThreadPriority(GetCurrentThread(),
        dwPriorityOriginal);
    //
    // If restore fails, maybe retry or throw an exception.  Otherwise,
    // the thread will continue to execute other work items at increased
    // priority.
    //
    if (FALSE == bRet) {
        _tprintf(_T("Fatal Error! SetThreadPriority failed. LastError: %u\n"),
            GetLastError());
        return;
    }
    _tprintf(_T("MyWorkCallback: thread priority restored.\n"));
    return;
}
VOID
    DemoCleanupPersistentWorkTimer()
{
    BOOL bRet = FALSE;
    PTP_WORK work = NULL;
    PTP_TIMER timer = NULL;
    PTP_POOL pool = NULL;
    PTP_WORK_CALLBACK workcallback = MyWorkCallback;
    PTP_TIMER_CALLBACK timercallback = MyTimerCallback;
    TP_CALLBACK_ENVIRON CallBackEnviron;
    PTP_CLEANUP_GROUP cleanupgroup = NULL;
    FILETIME FileDueTime;
    ULARGE_INTEGER ulDueTime;
    UINT rollback = 0;
    InitializeThreadpoolEnvironment(&amp;CallBackEnviron);
    //
    // Create a custom, dedicated thread pool.
    //
    pool = CreateThreadpool(NULL);
    if (NULL == pool) {
        _tprintf(_T("CreateThreadpool failed. LastError: %u\n"),
            GetLastError());
        goto main_cleanup;
    }
    rollback = 1; // pool creation succeeded
    //
    // The thread pool is made persistent simply by setting
    // both the minimum and maximum threads to 1.
    //
    SetThreadpoolThreadMaximum(pool, 1);
    bRet = SetThreadpoolThreadMinimum(pool, 1);
    if (FALSE == bRet) {
        _tprintf(_T("SetThreadpoolThreadMinimum failed. LastError: %u\n"),
            GetLastError());
        goto main_cleanup;
    }
    //
    // Create a cleanup group for this thread pool.
    //
    cleanupgroup = CreateThreadpoolCleanupGroup();
    if (NULL == cleanupgroup) {
        _tprintf(_T("CreateThreadpoolCleanupGroup failed. LastError: %u\n"),
            GetLastError());
        goto main_cleanup;
    }
    rollback = 2;  // Cleanup group creation succeeded
    //
    // Associate the callback environment with our thread pool.
    //
    SetThreadpoolCallbackPool(&amp;CallBackEnviron, pool);
    //
    // Associate the cleanup group with our thread pool.
    // Objects created with the same callback environment
    // as the cleanup group become members of the cleanup group.
    //
    SetThreadpoolCallbackCleanupGroup(&amp;CallBackEnviron,
        cleanupgroup,
        NULL);
    //
    // Create work with the callback environment.
    //
    work = CreateThreadpoolWork(workcallback,
        NULL,
        &amp;CallBackEnviron);
    if (NULL == work) {
        _tprintf(_T("CreateThreadpoolWork failed. LastError: %u\n"),
            GetLastError());
        goto main_cleanup;
    }
    rollback = 3;  // Creation of work succeeded
    //
    // Submit the work to the pool. Because this was a pre-allocated
    // work item (using CreateThreadpoolWork), it is guaranteed to execute.
    //
    SubmitThreadpoolWork(work);

    //
    // Create a timer with the same callback environment.
    //
    timer = CreateThreadpoolTimer(timercallback,
        NULL,
        &amp;CallBackEnviron);

    if (NULL == timer) {
        _tprintf(_T("CreateThreadpoolTimer failed. LastError: %u\n"),
            GetLastError());
        goto main_cleanup;
    }
    rollback = 4;  // Timer creation succeeded
    //
    // Set the timer to fire in one second.
    //
    ulDueTime.QuadPart = (LONGLONG) -(1 * 10 * 1000 * 1000);
    FileDueTime.dwHighDateTime = ulDueTime.HighPart;
    FileDueTime.dwLowDateTime  = ulDueTime.LowPart;
    SetThreadpoolTimer(timer,
        &amp;FileDueTime,
        0,
        0);
    //
    // Delay for the timer to be fired
    //
    Sleep(1500);
    //
    // Wait for all callbacks to finish.
    // CloseThreadpoolCleanupGroupMembers also releases objects
    // that are members of the cleanup group, so it is not necessary
    // to call close functions on individual objects
    // after calling CloseThreadpoolCleanupGroupMembers.
    //
    CloseThreadpoolCleanupGroupMembers(cleanupgroup,
        FALSE,
        NULL);
    //
    // Already cleaned up the work item with the
    // CloseThreadpoolCleanupGroupMembers, so set rollback to 2.
    //
    rollback = 2;
    goto main_cleanup;
main_cleanup:
    //
    // Clean up any individual pieces manually
    // Notice the fall-through structure of the switch.
    // Clean up in reverse order.
    //
    switch (rollback) {
    case 4:
    case 3:
        // Clean up the cleanup group members.
        CloseThreadpoolCleanupGroupMembers(cleanupgroup,
            FALSE, NULL);
    case 2:
        // Clean up the cleanup group.
        CloseThreadpoolCleanupGroup(cleanupgroup);
    case 1:
        // Clean up the pool.
        CloseThreadpool(pool);
    default:
        break;
    }
    return;
}
VOID
    DemoNewRegisterWait()
{
    PTP_WAIT Wait = NULL;
    PTP_WAIT_CALLBACK waitcallback = MyWaitCallback;
    HANDLE hEvent = NULL;
    UINT i = 0;
    UINT rollback = 0;
    //
    // Create an auto-reset event.
    //
    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (NULL == hEvent) {
        // Error Handling
        return;
    }
    rollback = 1; // CreateEvent succeeded
    Wait = CreateThreadpoolWait(waitcallback,
        NULL,
        NULL);
    if(NULL == Wait) {
        _tprintf(_T("CreateThreadpoolWait failed. LastError: %u\n"),
            GetLastError());
        goto new_wait_cleanup;
    }
    rollback = 2; // CreateThreadpoolWait succeeded
    //
    // Need to re-register the event with the wait object
    // each time before signaling the event to trigger the wait callback.
    //
    for (i = 0; i < 5; i ++) {
        SetThreadpoolWait(Wait,
            hEvent,
            NULL);
        SetEvent(hEvent);
        //
        // Delay for the waiter thread to act if necessary.
        //
        Sleep(500);
        //
        // Block here until the callback function is done executing.
        //
        WaitForThreadpoolWaitCallbacks(Wait, FALSE);
    }
new_wait_cleanup:
    switch (rollback) {
    case 2:
        // Unregister the wait by setting the event to NULL.
        SetThreadpoolWait(Wait, NULL, NULL);
        // Close the wait.
        CloseThreadpoolWait(Wait);
    case 1:
        // Close the event.
        CloseHandle(hEvent);
    default:
        break;
    }
    return;
}
int _tmain(int argc, _TCHAR* argv[])
{
    DemoNewRegisterWait();
    DemoCleanupPersistentWorkTimer();
    return 0;
}

最后觉得项目中的控制台不大好用,就添加了一些小功能,比如清屏;当然最简单的方法是调用系统自带的函数system(“cls”);,这里提供一个方法一样可以清屏(测试要比cls快一些):

下载地址:http://explore.live.com/windows-live-essentials-beta

默认是完全安装版,可以在右边选择可定制版

image

可定制版中文版:http://g.live.com/1rebeta4_webc/zh-cn/wlsetup-webc.exe

Windows Live Essentials Wave 4 Beta 组件包括:照片库、Mail、影音制作、Messenger、Writer、家庭安全设置、Bing 工具栏、Messenger Companion、Sync,以及 Silverlight 和 Office Outlook Connector

预编译头文件的最大好处在于如果只改动一小处代码,不用把相关有依赖的代码全部编译一次,这样可以很大的节约编译时间。

对于没有添加预编译头文件的项目,在添加时有个认识误区,就是认识只要在工程里设置使用预编译头文件就可以了,最近在项目里设置发现有问题,比如找不到导出符号,或符号重定义之类错误。

这个原因是因为原来的QQ安装不正确或MSI文件丢失,解决方法很简单XP可以使用WCL就可以了; 在Windows 7下先打开安装文件,如果出错也不点,打开 C:\Users\用户名\AppData\Roaming\Tencent\QQ\STemp\,会看到有个TXQQ20520之类的文件夹, 在这有个QQ2010.msi,直接在“添加删除”里支持QQ的删除程序指向这个文件,等完成后重新安装就可以了。

//

// Usage: SetThreadName (-1, "MainThread");

//

#include <windows.h>

#define MS_VC_EXCEPTION 0x406D1388



#pragma pack(push,8)

typedef struct tagTHREADNAME_INFO

{

   DWORD dwType; // Must be 0x1000.

   LPCSTR szName; // Pointer to name (in user addr space).

   DWORD dwThreadID; // Thread ID (-1=caller thread).

   DWORD dwFlags; // Reserved for future use, must be zero.

} THREADNAME_INFO;

#pragma pack(pop)



void SetThreadName( DWORD dwThreadID, char* threadName)

{

   Sleep(10);

   THREADNAME_INFO info;

   info.dwType = 0x1000;

   info.szName = threadName;

   info.dwThreadID = dwThreadID;

   info.dwFlags = 0;



   __try

   {

      RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );

   }

   __except(EXCEPTION_EXECUTE_HANDLER)

   {

   }

}





转载至http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx

纵览,国内比较大的软件公司(以下统一简称"国软"),清一色都是做政府项目的(他们能做大的原因我就不用说了吧),真正能做大的国软又有几家呢?更何况开源企业,这是为什么呢?
今天风吹就给大家简单分析下:
1."作坊"式管理
"作坊"往往是效率最高的, 国软几乎都是从作坊走过来的,但把作坊式的管理模式套用到一个不断壮大的公司中显然是不行的.组织架构到达一定程度后就必然要进行分工的细化,依靠作坊式的"暴力开发"是行不通的.
2."法制社会"
上班必须打卡,迟到要扣钱,还一次比一次多,加班没有加班费,反正算下来就是,只有扣钱的项目,没有加钱的项目.比起外企,人家上班不打卡,迟到不扣钱,加班有加班费,这样宽松点的环境不好吗?
3. 自身自灭
国软一般没有师徒制,有的话也只是形式上的,公司基本没人管你,你也不用去管别人,新进的员工,不管会不会,先丢个东西给你做,自己研究,不懂的google去.这也是为什么国软喜欢招有经验的人,因为没经验的人熬不住,跑了几个以后,国软就不招了.
4. 销售-开发-维护脱节
这点是非常严重的,会直接导致项目流产的.国软的典型的做法是,销售为了业绩,在没有调研的情况下就签了合同 (这里主要是指项目型的,产品型的一般可以控制),而且合同的范围也非常模糊,可大可小,接下来就是调研人员上场,调研后发现,10w块钱的合同,调研出来了100w的需求,接下来就是和客户扯皮,最后直接导致项目流产,甚至打上官司.项目或产品上线后,维护人员对系统不了解(一方面是没有文档,另外一方面维护人员一般没有参与到开发中),接下来往往就会发生两种情况:
a.维护人员在不了解系统的情况下擅自修改,结果导致系统越改问题 越多.
b.维护人员一不做二不休,所有客户反馈的问题全部打回给开发人员,于是开发人员就生不如死,在做别的项目的同时还要维护以前的项目,结果就是导致几个项目都失败.
5.缺乏规划
今天要用这个,明天想用那个(笔者就经历了公司在半年的时间内对框架进行了两次大的变动,导致开发人员都必须重新学习框架)产品也接,项目也接,大的也接,小的也接.今天领导说往左走,明天说往右走,也不能怪领导,他也没经验,我们就是他的DEMO.公司没有一个明确的目标,要做成什么样,只是一味的提出做大做强,但是没有规划出如何做大做强.(和我的标题一样哦)
6.三无-无需求,无设计,无测试.
a.没有文档是国软的通病,曾几何时,产品经理丢过来的那一句话:" 喂,**,给我做一个**模块来",然后开发人员就开始埋头苦写了.
b.当然如果你天资聪慧,可以轻易理解出产品经理的意思,那有没有设计都无所谓了,但是,当有一天别人要维护你的程序的时候问题就出现了,没有文档,代码又那么天马行空,怎么维护?改了这个地方,又影响了那个地方...
c.其实程序员都懂得测试的意义,可以工时安排的那么紧,哪来的时间测试?测试又没有算工时.所以几乎所有的程序员的做法就是,直接丢给用户测试
这时候有人肯定要问:那项目经理呢?他不是可以测试吗?请记住这是国软,刚才写代码的那个人就是项目经理,还是售前,还是设计人员,还是维护,还是...归结还是成本问题,在外资软件公司中,做文档的工时是比做开发的工时更多的,国软为了节省成本,这块当然要 CUT掉了.不必去追去文档有多么详细多么美观,需要做的就是找到一个平衡点,一份适合自己的文档.
7.员工都是"十项全能"
在国软里面的员工各个都是十项全能(笔者就是一个鲜明的例子,从系统调研分析设计,到进度管理,开发,测试,验收,实施,维护,甚至拉给客户拉网线都需要我去.)直接导致的结果就是这些员工每过多久就直接出来自己开公司了...嘿嘿又一家作坊诞生了...这样做对员工个人其实是有好处的,但是对于企业本上来说是没有好处的,并不是说员工成立了作坊,成为了你的竞争对手,而是让员工各个都是十项全能的结果就是
a.员工都是"十项全不 能".
b.员工一旦离职,他手头的项目必定流产.
c.对公司的发展是不利的(细化分工).
8.莫不关心
老板并不知道员工在做什么,员工也不知道老板在做什么.上级很少去关心下级的工作,更别说去关心下级的生活,一个东西丢给你,一个月后交差,中间不管你任何事情,交不了差就唯你是问.下级也不知道能为上级分担什么,只有等着上级分配任务.甚至还有些老板都不不知道员工的名字,在这样的国软的,每个人都是孤立的,又怎么能做大做强呢?
9.企业文化
所谓十年树木,百年树人.国软的企业文化表面功夫算是做的很好的了,什么"为客户创造价值","做最好的行业解决方案","软件公司的最大资源就是人才"等等,要多华丽有多华丽,重复体现了"口号文化".真正做到企业文化又有多少呢?有多少仅仅是为了做给客户看的呢?
10.盲目跟风
很多国软看到人家外企软件公司最近在搞什么推进活动,就跟风,效仿外企做,可是无法领悟精髓,纯粹只是在模仿.(外企集体笑:"一直被模仿,从未被超越")做完了也不知道这么做的意义,劳民伤财.
11.缺乏"执行力"
国软的通病,就是"执行力",国软的学习劲头很足,今天提出要完善测试标准,明天提出要每周写工作报告,可是又有哪些东西能真正的去执行呢?
导致这个问题的主要原因有两个:
a.提出来的东西到底有没必要做,还是只是应付领导走个过场.
b.谁来跟踪这些东西?员工写了工作报告,领导没有去查看,去反馈,员 工觉得写的也没意义,自然不会继续执行下去.
12.管理混乱
没有划分清楚员工的归属组织,员工并不明确他的上级领导是谁,导致有的员工处于游离状态,有的是员工又是多个领导,不懂要听谁的,有些人忙的要死,有些人又闲的要命,最后搞的最痛苦的就是员工,导致员工离职.
13.缺乏团队精神
为什么会缺乏团队精神呢?并不是国软没有这方面的概念,国软也很希望培养员工的团队观念 和精神,
无奈因为国软,一般都是一个人负责一个或者多个项目,连团队都没有,何来的团队精神?
14.无法做到补 足
一个项目一旦中途有人辞职,这个项目就会流产.一个员工一旦辞职,会有N个项目没人维护.A组的员工无法胜任B组的工作,归根结底就是组织上根本没有考虑过组织变动对项目的影响,没有提前培养人员.
15.一成不变和随心所欲
有两类人一种是把前辈的东西COPY过来,不作任何修改,因为他深信,前辈的一定是对的,还有一类是不管前人怎么做的,一律不要,全凭自己的"经验",随心所欲,天马行空的进行自主研发,造成的结果就是错的还是错的,乱的更乱了.
16.人才育成
成本,还是成本,培养一个人要多少成 本?这就是国软做不大的原因,永远只能停留在"作坊"的原因.
17.向心力.
老板做的是事业,员工做的是事情, 这是国软员工的一致观点.
18.恶性循环
a.人员力量不足 -> 接不了项目 -> 收入少 -> 人员流失.
b.人员力量不足 -> 强行接项目 -> 亏本 -> 破产.
最后 我想说一句的是:成也国软,败也国软.
说的不对的地方请大家指出,或者补充下没说到的地方.