lpSecurityAttributes passed to CreateNamedPipe()?The MSDN documentation for CreateNamedPipe() says:
lpSecurityAttributes [in, optional]
A pointer to a SECURITY_ATTRIBUTES structure that specifies a security descriptor for the new named pipe...
Emphasis mine. Does 'new' mean new named pipe, or new instance of the named pipe? It goes on to say:
Remarks
To create an instance of a named pipe by …
在保存时,编辑器FooEdit(称为FooEdit)使用ReplaceFile()来确保保存操作实际上是原子的,并且如果出现任何错误,则将保留光盘上的原始文件。(ReplaceFile()的另一个重要优点是文件身份的连续性-创建日期和其他元数据。)
FooEdit还使用仅FILE_SHARE_READ的共享模式来打开文件的句柄,以便其他进程可以打开文件,但在FooEdit可以打开文件的同时不能写入文件。
“显然”,在执行ReplaceFile操作时必须短暂关闭此句柄,这允许在FooEdit重新建立它的FILE_SHARE_READ锁句柄之前,另一个进程可以打开具有写访问权的文件的竞争。
(如果FooEdit在调用ReplaceFile()之前没有关闭其FILE_SHARE_READ句柄,则ReplaceFile()将失败,并出现共享冲突。)
我想知道解决这场比赛的最简单方法是什么。这些选项似乎是找到另一种方法来锁定与ReplaceFile()兼容的文件(我看不出这是怎么可能的)或复制ReplaceFile()的所有行为,而是使用现有的文件句柄来访问目标文件而不是路径。我对如何从用户代码中自动执行ReplaceFile()的所有操作有些困惑(无论如何,重新实现ReplaceFile()似乎是个坏主意)。
这肯定是一个普遍的问题,所以可能有一个我错过的明显解决方案。
(此问题似乎相关,但是没有答案:在Windows上以事务方式写入文件更改。)
这是一个最小的可验证示例,显示了我要实现的目标(UTC时间13:18 30/9/2015更新)。您必须提供三个文件名作为命令行参数,所有文件名都在同一卷上。第一个必须已经存在。
我总是从ReplaceFile()得到共享冲突。
#include <Windows.h>
#include <stdio.h>
#include <assert.h>
int main(int argc, char *argv[])
{
HANDLE lock;
HANDLE temp;
DWORD bytes;
if (argc != 4)
{
puts("First argument is the project file. Second argument is the temporary file.");
puts("The third argument is the backup file.");
}
/* Open and lock the project file to make sure no one else can modify it */
lock = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, …Run Code Online (Sandbox Code Playgroud) 我正在使用StreamReaderwith JsonTextReader来反序列化包含成千上万个小对象的大型JSON文件,其消耗方式比我认为的合理(而且用尽)更多。我使用的是我所理解的读取大文件的推荐模式。
出于说明目的而简化的代码:
using (StreamReader streamReader = new StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(streamReader))
{
JToken token;
while (reader.Read() && reader.TokenType != JsonToken.EndArray)
{
token = JToken.Load(reader);
RawResult result = token.ToObject<RawResult>();
results.Add(result);
}
}
Run Code Online (Sandbox Code Playgroud)
VS2015内存探查器告诉我,大多数内存都被Newtonsoft.Json.Linq.JValue对象占用,这很奇怪,因为一旦转换了当前令牌ToObject(),就没有理由(就我而言)不应该将其丢弃。
我假设Newtonsoft库会将到目前为止已解析的所有JSON保留在内存中。我不需要它来做,我想如果我能防止这种情况,我的记忆力问题就会消失。
该怎么办?
我想知道的是,对象是否会从一个类引用来创建一个特定的类或任何其后代的一个实例.
换句话说,我想要一个布尔表达式,如
var is TMyClass
Run Code Online (Sandbox Code Playgroud)
但是var被替换为涉及类引用变量的表达式.这听起来很容易,但让我完全难过.
我可以创建一个实例var:= classRefVar.Create,测试它,然后销毁它,但这是一个巨大的开销.
奇怪的是,编译器不会让我拥有
classRefVar(nil) is TMyClass
Run Code Online (Sandbox Code Playgroud)
但对于看似等效的语法却很无用,却很无用
TMyClass(nil) is TMyClass
Run Code Online (Sandbox Code Playgroud)
显然,表达
classRefVar = TMyClass
Run Code Online (Sandbox Code Playgroud)
并不好,因为classRefVar可能引用了TMyClass的后代.
当我看到答案时,我期待着自己踢...
我希望获得与Visual Studio 2010+相同的效果,如果您将编辑器浮动在主窗体的顶部,单击主窗体菜单或工具栏按钮不会导致主窗体窃取焦点; 相反,浮动窗口保持焦点.
如果没有这个,当聚焦控件处于浮动窗口时,就不可能调用在聚焦控件上操作的任何主菜单命令 - 因为你想要操作的控件在调用命令时失去焦点.

(具有讽刺意味的是,如果你仔细观察这个图像,你会看到编辑器中的选择是静音的,表明编辑器控件没有焦点.Visual Studio似乎做了一些略微狡猾的事情来实现浮动的错觉窗口仍然是焦点.)
HTTP PUT 请求的主体是一个 JSON 列表 - 像这样:
[item1, item2, item3, ...]
Run Code Online (Sandbox Code Playgroud)
我无法改变这一点。(如果根是一个 JSON 对象而不是一个列表,那就没有问题了。)
使用 FastAPI 我似乎无法以正常方式访问此内容:
@router.put('/data')
def set_data(data: DataModel): # This doesn't work; how do I even declare DataModel?
Run Code Online (Sandbox Code Playgroud)
我找到了以下解决方法,这似乎是一个非常丑陋的黑客:
class DataModel(BaseModel):
__root__: List[str]
from fastAPI import Request
@router.put('/data')
async def set_data(request: Request): # Get the request object directly
data = DataModel(__root__=await request.json())
Run Code Online (Sandbox Code Playgroud)
这肯定不是实现这一目标的“批准”方式。我已经搜索了 FastAPI 和 pydantic 的文档。我错过了什么?
我在其中一个网站上看到了C中的一个面试问题,你被要求编写一个函数,该函数得到2个整数,num和times,并且不使用*运算符多个,这意味着主要使用左右移位.我提出了一个有效的答案(除非有人发现了一个错误),但是有没有人有更好的方法在更好的时间或内存消耗中解决它?
这是我写的:
#include <stdio.h>
int multiply_with_shift (int num, int times)
{
int cnt=0;
int org_times=times;
if((num & times)==0)
return 0;
else
{
while(times >1)
{
times= times >> 1;
cnt++;
}
int val= 1;
val= val <<cnt;
int sub= org_times-val;
int res= num << cnt;
for( int i=0 ; i < sub; i++)
{
res+=num;
}
return res;
}
}
void main()
{
int tmp;
tmp=multiply_with_shift(5,15);
printf(" the answer is : %d \n", tmp);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
?